图解JVM 对象是否存活 (一): 引用计数法

解析

引用计数法是众多判断对象存活与否之间的一个方法.
此方法很简单, 如果有引用指向该对象, 该对象的计数器+1, 如果引用被断开(null), 计数器 -1.

此方法解决不了循环引用的问题(即A指向B, B指向A)

图解

实践

jvm参数: -verbose:gc

package cn.geek51;

// 引用计数方法
public class ReferenceCountingGC {

    public Object instance = null;
    private static final int _1MB = 1024 * 1024;

    private byte[] bigSize = new byte[2 * _1MB];

    public static void main(String[] args) {
        // objA引用计数值+1
        ReferenceCountingGC objA = new ReferenceCountingGC();
        // objB引用计数值+1
        ReferenceCountingGC objB = new ReferenceCountingGC();
        // 相互引用, objA和objB都=2
        objA.instance = objB;
        objB.instance = objA;

        // 赋值为null, 引用计数-1 都=1
        objA = null;
        objB = null;

        // 这里发生GC
        System.gc();
        // 结果: 发生了GC, 说明JVM不是采用引用计数法
    }
}

结果

虽然计数器不是为0, 但是仍然发生了GC, 说明JVM并不是采用此方法进行判断的.

[GC (System.gc())  6717K->784K(123904K), 0.0008424 secs]
[Full GC (System.gc())  784K->653K(123904K), 0.0042530 secs]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值