JVM安全点详解

1、安全点是什么?

在虚拟机在进行可达性分析时,HotSpot虚拟机会在特定的位置记录在哪有引用,这些特定的位置就叫做安全点。

2、安全点的作用是什么?

上边已经说过了,在Oomap的帮助下,HotSpot虚拟机很快就完成了GC Roots枚举,但是我们不可能给每一个指令都声成对应的OoMap,那样会造成大量的内存浪费,安全点的作用就是来表示程序执行到安全点时,可以看作冻结状态,因此安全点选定的既不能太少,导致GC等待时间变长,也不能太多,造成系统的负荷。但是大部分的指令执行都很快,程序长时间执行最显著的特征就是“指令复用”,例如循环。

3、如何实现在GC发生时使线程在安全点进入冻结状态?

有两种方案:抢先式中断、主动式中断

抢先式中断:抢先式中断指的是在GC发生时,现将所有线程都中断,然后再检查没有到安全点的线程恢复执行到安全点。

主动式中断:主动式中断指的是在GC需要中断线程时,不直接操作线程,只是置一个标志,让所有线程去轮询这个标识为,当标志为真时则自己中断挂起,轮训标志的地方和安全点是重合的,另外再加上创建对象所需要分配内存的地方。

4、安全区域

上边的safepoint看似已经完美的解决了,GC时如何处理线程的问题,但是如果说线程处于Sleep或者Block状态呢,他是不能响应中断的,因此无法完成走到安全点挂起这一操作,因此安全区域的概念出来了,即在该区域内任何位置开始GC都是可以的。