jvm必知必会--安全点&安全区

安全点:

1.什么是安全点:

在特定的某些地方记录了 oopmap数据结构【记录引用关系信息】,这些特点的地点叫做 安全点。

参考:【从线程角度看,safepoint可以理解成是在代码执行过程中的一些特殊位置,当线程执行 到这些位置的时候,说明虚拟机当前的状态是安全的,如果有需要,可以在这个位置暂停,比如发生GC时,需要暂停所有活动线程,但是该线程在这个时刻,还没有执行到一个安全点,所以该线程应该继续执行,到达下一个安全点的时候暂停,然后才开始GC,该线程等待GC结束。】

2.为什么需要安全点,以及为什么线程需要到达安全点:

【1.如果为每条指令都插入oopmap,那么将会产生大量的内存损耗】

【2.如果没有安全点,就无法知晓具体的引用关系变化情况】

【3.当线程执行指令达到安全点时,才会更新oopmap,才能得知最新的引用关系变化情况】

3.安全点的选取规则:

安全点的选定基本上是以”是否具有让程序长时间执行的特征“为标准选定的,”长时间执行“最明显的特征就是 指令序列复用,如:方法调用,循环跳转,异常跳转等。具有这些功能的指令才有产生safepoint。

4.如何让程序执行线程达到安全点:

抢先式中断:

GC时,把全部线程中断,如果有线程不在安全点上,那就让他”跑“到安全点上。【几乎没有虚拟机采用抢先式中断】

主动式中断:

当GC需要中断线程的时候,不直接对线程操作,而是设置一个中断标志,线程主动轮询这个中断标识,如果为真,则在安全点自动中断挂起。轮询标志的地点和安全点时重合的,另外在加上创建对象需要分配内存的地方。

安全区域:

1.什么是安全区域:

安全区域是指在一段代码片段中,引用关系不会发生变化。在这个区域任何地方开始gc都是安全的。我们可以把saferegion 看成扩展版的 safepoint。

2.为什么需要安全区域:

当线程无法响应jvm的中断请求,如线程属于sleep或者blocked状态,就需要安全区域来解决。

3.gc,线程,安全区域的关系:

当线程执行到 saferegion 时,会标识自己进入了saferegion,当gc时,就不用管标识自己为saferegion的线程了。

当线程要离开saferegion时,就检查系统是否已经完成了根节点枚举(或者整个gc过程),如果完成了就继续执行,如果没有,就等到可以安全离开saferegion的信号为止。

你可能感兴趣的:(jvm必知必会--安全点&安全区)