「每天一道面试题」如何确定JVM堆中哪些对象是可以被回收的

「每天一道面试题」如何确定JVM堆中哪些对象是可以被回收的

积累

垃圾回收器在对堆进行回收之前,需要确定堆中哪些对象是可以继续存活的,哪些是可以被回收的,Java采用可达性分析算法来判定对象是否可以继续存活。

这个算法的过程是通过一系列的称为“GC Roots”的对象作为起点,从这些起始点开始向下搜索,搜索过程中所有走过的路径称为引用链,当一个对象和引用链没任何连接的时候,则表明这个对象是可以被回收的。

可作为“GC Roots”对象的有如下几种:

  1. Java虚拟机栈(栈帧中的本地变量表)中引用的对象;

  2. 本地方法栈中JNI(即一般说的Native方法)引用的对象;

  3. 方法区中类静态属性引用的对象;

  4. 方法区中常量引用的对象。

还有一个用于标识哪些对象可以被回收的算法,不过这个算法并没有被Java语言采用,即引用计数法。这个算法的过程是:给每个对象添加一个引用计数器,每当这个对象被引用一次,计数器加一;每当这个对象引用失效的时候,计数器减一;引用计数器为零的对象表示是可以被回收的对象。虽然这个算法很简单,但是它无法解决对象之间互相循环引用的问题,所以Java没有采用。