JVM的安全点
JVM的安全点
有两种查找 GC Roots 的方法:
- 遍历方法区和栈区查找(保守式 GC)
- OopMap 数据结构来记录 GC Roots 的位置(准确式 GC)
对应 OopMap 的位置即可作为一个安全点(Safe Point)。安全点意味着在这个点时,所有工作线程的状态是确定的,JVM 就可以安全地执行 GC 。
如何选定安全点
- 循环的末尾
- 方法临返回前
- 调用方法之后
- 抛异常的位置
为什么选定这些位置作为安全点:主要的目的就是避免程序长时间无法进入 Safe Point。
安全区域又是什么?Safe Region 是指在一段代码片段中,引用关系不会发生变化。在这个区域内的任意地方开始 GC 都是安全的。