java垃圾回收算法,引用计数法及标记清除

(1)垃圾回收算法:引用计数法

对象是否存活判断1 堆中每个对象实例都有一个引用计数,

2 当创建一个对象时,且将该对象实例分配给一个变量,该变量计数设置为1。

3 当其他变量被赋值为这个对象的引用时,计数加1 (a=b则引用的对象实例的计数+1),

4 但当一个对象实例的某个引用超过了生命周期或被设置为一个新值时,对象实例的引用计数减1,

5 任何引用计数器为0的对象实例可以被当作垃圾收集,

6 当一个对象实例被垃圾收集时,它引用的任何对象实例的引用计数器减1

引用计数收集器可以很快的执行,交织在程序运行中。对程序需要不被长时间打断的实时环境比较有利

无法检测出循环引用。如父对象有一个对子对象的引用,子对象反过来引用父对象。这样它们的引用计数永远不为0

public class ClsA {
    public ClsB clsB;
    private String name1 = "";
}
public class ClsB {
    public ClsA clsA;
    private String s1 = "";
}

    public static void main(String[] args) throws Exception {
        System.out.println("this is out"+ System.currentTimeMillis() );
        ClsA clsA = new ClsA();
        ClsB clsB = new ClsB();
        clsA.clsB = clsB;
        clsB.clsA = clsA;// clsA与clsB循环引用
        System.out.println("end is out");
    }

(2)垃圾回收算法:标记清除

最基础的收集算法是"标记-清除"Mark-Sweep算法,分为标记和清除两个阶段

1 首先标出所有需要回收的对象,标记完成后统一回收

2 它的主要不足有两个

一 效率问题,标记和清除两个过程的效率不高

二 空间问题,标记清除之后会产生(1)大量不连续的内存碎片

(2)空间碎片太多可能会导致以后分配较大的对象时,

(3)无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值