1. 枚举根节点

可达性分析对执行时间的敏感体现在GC停顿上,这项工作必须再一个能确保一致性的快照中进行。这里“一致性”指在整个分析期间整个系统看起来就像被冻结在某个时间点上,不可以出现分析过程中对象引用关系还在不断变化的情况。这导致GC进行必须停顿所有Java执行线程,这个称为“Stop The World”。当然执行系统停顿下来后,不需要一个不漏地检查完所有执行上下文和全局的引用位置,VM通过一组OopMap数据结构可以得知哪些地方存放着对象的引用,减少可达性分析代价。

2. 安全点(Safe Point)

为每一条指令都生成对应OopMap会占用额外空间,因此VM只在特定位置记录这些信息,这些位置称作“安全点”。即当程序执行到SafePoint才能暂停进行GC。为了让GC的时候所有线程都到最近的安全点上,VM采用主动式中断的方法。

  • 主动式中断:GC需要中断线程的时候,不直接对线程进行操作,而是设置一个标记,各个线程执行的时候主动去轮训这个标记,发现中断标志位真就自己中断挂起。

3. 安全区域(Safe Regin)

安全点无法去处理那种处于休眠和阻塞状态的线程。因此引入了安全区域的概念。安全区域指在一端代码片段之中,引用关系不会发生变化。这个区域中的任意地方开始GC都是安全的。

过程:线程执行到安全区域中的代码时,标记自己已经进入安全区域。JVM发起GC时就不用管在Safe Regin状态的线程。线程要离开Safe Regin时,检查系统是否完成了根节点枚举。如果完成才可以继续执行,否则不能退出安全区域。