HotSpot 的算法实现

垃圾回收算法在 HotSpot 虚拟机上的实现。

前言

一本好书,每读一遍都会有不同的感受。写读书笔记,一来是便于平时查阅,毕竟技术书籍都比较厚,不方便随时携带;二来是督促自己多读书,理论与实践结合才能不断提升自己。

【深入理解Java虚拟机】阅读笔记: 3.4 HotSpot 的算法实现

枚举根节点

  • 主流虚拟机使用的都是准确式 GC,即虚拟机可以知道内存中某个位置的数据是什么类型
  • 可作为 GC Roots 的节点主要在全局性的引用 (例如常量或类静态属性) 与执行上下文 (例如栈帧中的本地变量表) 中
  • 可达性分析必须在一个能确保一致性的快照中进行,否则分析结果准确性无法保证。因此 GC 进行时必须停顿所有 Java 执行线程 (Stop The World)
  • 使用 OopMap 直接得知哪些地方存放着对象引用。

安全点

  • HotSpot 没有为每条指令都生成 OopMap, 只是在特定的位置记录了这些信息,这些位置称为安全点 (SafePoint)。程序只有在到达安全点时才能暂停
  • 主动式中断的思想是当 GC 需要中断线程的时候,设置一个标志,各个线程执行时主动轮询该标志,发现中断标志为真时就自己中断挂起。
  • 轮询标志的地方和安全点是重合的,另外再加上创建对象需要分配内存的地方

安全区域

  • 程序不执行时无法响应 JVM 的中断请求,需要安全区域 (Safe Region) 来解决
  • 安全区域是指在一段代码中,引用关系不会变化,在该区域中的任意地方开始 GC 都是安全的
  • 线程执行到 Safe Region 中的代码时,首先设置一个对应的标志
  • 线程离要开 Safe Region 时,先检查系统是否已完成根节点枚举,如果完成了就继续执行,否则必须等待收到可以安全离开的信号为止

参考

周志明. 深入理解Java虚拟机