许多教科书来判断对象师傅偶存活的算法是这样的:给对象添加一个引用计数器,每当有一个地方引用它时,计数器的值就加1;当引用失效时,计数器的值就减1;任何时刻计数器为0的对象就是不可能再被使用的。
上面这个算法叫做“引用计数算法”,实现简单,判定效率高昂,但是无法解决对象之间相互循环引用的问题。
例如:
MyClass referenceA=new MyClass();
MyClass referenceB=new MyClass();
referenceA.instance=referenceB;
referenceB.instance=referenceA;
referenceA=null;
referenceB=null;
System.gc();
以上代码执行之后,虚拟机并没有因为这两个对象相互引用就不回收他们,说明虚拟机不是通过引用计数算法判断对象存活的。
其实虚拟机是采用可达性分析算法来判断对象死活的。
例如:
对象object5,object6,object7虽然相互有关联,但是他们到GC ROOTS是不可达的,所以他们将会被判定为是可回收的对象。