Hotspot GC实现原理

GC扫描

可达性分析的GC Roots主要是全局性引用或在Stack Frame中 ,现在的应用仅仅方法区往往就有几百兆,这样要这个检查这里面的引用,就必然会消耗很多时间,效率很低。

分析工作在一个保证一致性的快照中进行。在整个分析期间,要确保整个执行系统被冻结,如果分析过程中对象引用还有不断变化,就会影响分析结果,准确性便无法保证。这是GC工作时必须停止当前所有线程的一个重要原因。

当系统停下来后,并不会一个不漏的检查所有全局区,而是通过使用一种称为 OopMap的数据结构来获取对象引用的位置信息。

类加载完成后,Hotspot就会把对象内什么偏移量上什么类型的数据计算出来,在编译过程中,也会在特点位置记录下栈和寄存器中那些位置是引用。这样GC扫描时就知道那些是引用了。

安全点

OopMap的协助下,Hotspot可以快速准确的枚举GC Roots

记录了引用信息的地方叫做Safepoint(安全点),在程序执行时,并不是所有的地方都能停顿下来开始GC,只有到达安全点才可以。

1)安全点不能少(GC等待时间太长),也不能太多(GC频繁启动)。所以安全点选定的标准就是,是否具有让程序长时间执行的特征。

2)还需要考虑,如何在GC发生时让所有线程都跑到最近的安全点上再停下了。

 

安全区

对于处于sleepblacked状态的线程,无法响应jvm发出的请求,走到安全点去中断挂起。这就需要Safe Region安全区。

安全区指的就是一段代码片段之中,引用关系不会发生变化。在这个区域任何地方开始GC都是安全的。在线程离开Safe Region 时会检查系统是否已经完成了GC,如果没有完成,就等待直到收到可以安全离开Safe Region的信号为止。

原文地址:https://www.cnblogs.com/holos/p/6622023.html