深入探索JVM垃圾回收:ARM服务器垃圾回收的挑战和优化
上QQ阅读APP看书,第一时间看更新

2.5 安全点

在垃圾回收中最常用的词就是STW。什么是STW?当GC运行时,为了遍历对象的引用关系,需要应用程序暂停,防止应用程序修改对象的引用关系导致GC标记错误,暂停应用程序就是所谓的Stop The World(简称STW)。但是STW背后的实现原理是什么?应用线程如何暂停,又如何恢复?

STW中涉及的第一个概念就是安全点(safepoint)。safepoint可以理解为代码执行过程中的一些特殊位置,当线程执行到这些位置时,说明虚拟机当前的状态是安全、可控的(安全可控指的是,通过JVM控制线程能找到活跃对象;能够检查或者更新Mutator状态),当Mutator到达这个位置时放弃CPU的执行,让JVM控制线程(VMThread是JVM的控制线程)执行。让Mutator在安全点停止的原因可以总结为两个:让VMThread能够原子地运行,不受Mutator的干扰;实现简单。

其实线程暂停有主动暂停和被动暂停,JVM实现的是主动暂停,在暂停之前,需要让手头的事情做完整以便暂停后能正常恢复。安全点在JVM中非常常见,不仅在GC中使用,在Deoptimization、一些工具类(比如dump heap等)中都会涉及。

由于JVM支持多线程及JVM内部的复杂性,可能同时存在不同的线程执行不同的代码的情况,例如解释器线程解释执行字节码,Java线程执行编译后的代码,线程执行本地代码,还存在JVM内部线程,这些线程也会执行一些并发工作,也会访问Java对象。不同的线程进入安全点的方法不同,下面分别介绍。