安全点

       用户线程暂停,GC线程要开始工作,但是要确保用户线程刚暂停的这行字节码指令是不会导致引用关系的变化。所以 JVM 会在字节码指令中,选一些指令作为“安全点”,比如方法调用、循环跳转、异常跳转等,一般是这些指令才会产生安全点

为什么叫做安全点?

       GC 时暂停业务线程,并不是抢占式中断(立马将业务线程中断)而是主动式中断

       主动式中断是设置一个标志,这个标志是中断标志,业务线程在运行过程中会不断的主动去轮询这个标志,一旦发现中断标志为 true 就会在在自己附近的“安全点”上主动中断挂起

安全区域

为什么需要安全区域?

要是业务线程都不执行(业务线程处于 sleep 或者是 Blocked 状态),那么程序就没办法进入安全点,对于这种情况就必须引入安全区域。

       安全区域是只能够确保在某一段代码片段之中,引用关系不会发生变化,因此,在这个区域中任何地方开始垃圾收集都是安全的,我们也可以把安全区域看做是被扩展拉伸了的安全点

       当用户线程执行到安全区域里面的代码时,首先会表示自己已经进入了安全区域,这段时间里JVM要发起 GC 就不必去管这个线程了。

       当线程要离开安全区域时,他要知道 JVM 是否已经完成回收了(根节点枚举,或者其他 GC 中需要暂停用户线程的阶段)

              1、如果完成了,那么线程就当什么事都没有发生过继续执行

              2、没有它就会一直在那等待,知道收到可以离开安全区域的信号为止

 

最后修改于 2020-08-21 15:29:45
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付
上一篇