什么是引用计数法
引用计数法用来判断对象是否存活
给对象中添加一个引用计数器,每当有一个地方引用它时,计数器的值加一;当引用失效时,计数器的值就减一,任何时刻计数器为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;//GCSystem.gc();}public static void main(String[] args) {testGC();}
}
结果
年轻代(Young Generation)的垃圾回收情况。
9302K是垃圾回收前年轻代占用的内存量,
872K是垃圾回收后年轻代占用的内存量,
75776K是年轻代的总容量。
这意味着在这次垃圾回收中,年轻代回收了大约9302K - 872K = 8430K的内存。
缺陷:
objA和objB相互引用;
实际上这两个对象不会再被使用,但是由于互相引用着对方,计数器不为0;
引用计数法无法回收这两个对象。