什么是引用计数法
引用计数法用来判断对象是否存活
给对象中添加一个引用计数器,每当有一个地方引用它时,计数器的值加一;当引用失效时,计数器的值就减一,任何时刻计数器为0的对象是不可能在被使用的。(存在问题)
优点:实现简单,效率高
但是为什么Java虚拟机中没有使用引用计数法来判断对象是否存活呢?
例子
package jvmDemo;
/*
引用计数法
testGC方法执行后,objA和obj会不会被清理呢?
*/
public class ReferenceCountingGC {
public Object instance=null;
private static final int _1MB=1024*1024;
private byte[] bigSzie=new byte[2*_1MB];
//成员变量的意义是占用点内存,以便能够在GC日志中看清楚是否被回收过
public static void testGC(){
ReferenceCountingGC objA=new ReferenceCountingGC();
ReferenceCountingGC objB=new ReferenceCountingGC();
objA.instance=objB;
objB.instance=objA;
objA=null;
objB=null;
//GC
System.gc();
}
public static void main(String[] args) {
testGC();
}
}
结果
年轻代(Young Generation)的垃圾回收情况。
9302K是垃圾回收前年轻代占用的内存量,
872K是垃圾回收后年轻代占用的内存量,
75776K是年轻代的总容量。
这意味着在这次垃圾回收中,年轻代回收了大约9302K - 872K = 8430K的内存。
缺陷:
objA和objB相互引用;
实际上这两个对象不会再被使用,但是由于互相引用着对方,计数器不为0;
引用计数法无法回收这两个对象。