图解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]