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虚拟机
相关文章
- 2017-10-20
主要介绍常见垃圾收集算法的思想。
- 2017-10-20
在堆里面存放着 Java 世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”。
- 2017-10-16
在 Java 虚拟机规范的描述中,除了程序计数器外,虚拟机的其他几个运行时区域都有发生 OutOfMemoryError 异常的可能。
- 2017-10-22
Java 内存自动管理可归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存。
- 2017-10-15
Java 虚拟机所管理的内存包括多个运行时数据区域,每个区都有自己的特点。