对象死了吗
垃圾收集器的目的就是回收掉虚拟机内存中无用的对象,而这些无用的对象我们称为“死掉的对象”。那么怎么判断一个对象已经“死掉”,即怎么判断一个对象是无用对象呢?
引用计数算法(Reference Counting)
就是给每个对象添加一个引用计数器,每当一个地方引用这个对象,计数器的值就加1,引用失效计数器就减1。那么,当计数器的值为0时,这个对象就是无用对象了,已而为没有引用指向这个对象,也就没办法再使用对象了。
这种垃圾收集器算法实现简单,判定效率高,但是有一个问题:无法处理对象相互引用的情况。这种情况下,相互引用的对象的引用计数器值都大于0,实际上相互应用的对象已经不能再被访问。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public class ReferenceCountingGC { public static void main(String[] args) { testGC(); } public Object instance = null; private static final int _1MB=1024*1024; /** * 这个成员属性的唯一意义就是占点内存,以便能在GC日志中看清楚是否被回收过 */ private byte[] bigSize = new byte[2 * _1MB]; public static void testGC(){ ReferenceCountingGC objA=new ReferenceCountingGC(); ReferenceCountingGC objB=new ReferenceCountingGC(); objA.instance=objB; objB.instance=objA; objA=null; objB=null; // 假设在这行发生GC,那么objA和objB是否能被回收? System.gc(); } } |
Java虚拟机不是通过引用技术算法来判断对象是否存活的,所以这个例子中,对象依然被回收了。
继续阅读