JVM如何判断哪些对象可以被回收

JVM如何判断哪些对象可以被回收
JVM判断一个对象是否存活用的是可达性分析而不是引用计数法

1.引用计数法
引用计数法思路是这样的,给对象添加一个引用计数器,有地方引用时,计数器就加1;当引用失效时就减1;当计数为0的时候就判定对象需要被回收

引用计数法有一个难以解决的问题就是相互循环引用问题。

例:
obj1.instance=obj2.instance;obj2.instance=obj1.instance;

2.可达性分析算法
这个算法的基本思路是通过一些列称为“GC Roots”的对象作为起始点,从这些点开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明对象需要被回收.

可以作为GCRoots的对象:

虚拟机栈中引用的对象
方法区中类静态属性引用的对象
方法区中常量引用的对象
本地方法栈中JNI引用的对象