JVM如何判断对象是否需要被回收

JVM判断一个对象是否存活用的是可达性分析而不是引用计数法

  • 引用计数法

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

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

例:

obj1.instance=obj2.instance;obj2.instance=obj1.instance;

  • 可达性分析算法

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

如图:

上图中o3,o4对象没有任何GC Roots可达到,所有这两个对象不可用了,需要被GC回收

Java可作为GC Roots的对象包括下面几种:

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

你可能感兴趣的:(java,jvm,java,算法,servlet,大数据)