Java中如何判断对象存活
1.引用计数法
给对象添加一个计数器,如果被引用则计数器加一;如果引用释放,计数器减一。当计数器为零时,代表该对象没有被引用那就需要回收了。如果两个对象互相引用怎么办?比如A引用了B,B又引用了A,A.reference=B;B.reference=A,那就无法释放。因此该算法未被采用。
2.可达性分析
从GCRoots对象出发,向下查找对象,查找的路径叫引用链,如果查找的对象到GCRoots没有任何引用链,那该对象是不可用的就可以被回收。
如图,Object4到GCRoots不存在引用链,故不可用,需要回收。
可以作为GCRoots的对象包括以下几种
1.虚拟机栈局部变量表中引用的对象;
2.本地方法栈局部变量表中引用的对象;
3.方法区中静态属性引用的对象;
4.方法区中常量引用的对象。
局部变量表中的引用的对象