算法思想

Reachability Analysis的基本思想是通过一些称为“GC Roots”的根对象作为起始节点集,通过这些对象,根据引用关系向下遍历,遍历所走过的路径被称为“引用链”(Reference Chain),当某个对象到GC Roots之间没有任何引用链,或用图论的话来说从GC Roots到该对象不可达时,我们认为该对象不可能再被使用。

对象存活判定算法有两种:引用计数法和可达性分析法。引用计数法虽然看起来简单,但是有很多例外情况(如循环引用问题)必须配合编写大量处理代码才能正确工作。而可达性分析算法就没有这个难题。

GC Roots

① 固定GC Roots

  1. 在虚拟机栈中引用的对象
  2. 在方法区中类静态变量引用的对象
  3. 在方法区中常量引用的对象
  4. 在本地方法栈中JNI引用的对象
  5. Java虚拟机内部的引用,如基本数据类型的Class对象、一些常驻的异常对象OutOfMemory、NullPointException、还有系统类加载器
  6. 所有被同步锁synchronized关键字持有的对象
  7. 反映Java虚拟机内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存等

② 动态加入的GC Roots

除了固定GC Roots,根据用户选用的垃圾收集器以及当前收集的内存区域不同,还可以有对象“临时性”地加入到GC Roots中,构成完整的GC Roots集合。譬如分代收集与局部回收,必须要考虑到内存区域是JVM的实现细节、各个内存区域也不是孤立的,完全有可能当前区域的某个对象被某个其他区域的对象所引用,这时候就需要将这些对象动态加入GC Roots,用来保证可达性分析的正确性。