福大大答案2020-10-06:安全
简单回答:安全点,主动式中断。url
中级回答:
用户线程暂停,GC 线程要开始工做,可是要确保用户线程暂停的这行字节码指令是不会致使引用关系的变化。因此 JVM 会在字节码指令中,选一些指令, 做为“安全点”,好比方法调用、循环跳转、异常跳转等,通常是这些指令才会产生安全点。
为何它叫安全点,是这样的,GC 时要暂停业务线程,并非抢占式中断(立马把业务线程中断)而是主动式中断。
主动式中断是设置一个标志,这个标志是中断标志,各业务线程在运行过程当中会不停的主动去轮询这个标志,一旦发现中断标志为 True,就会在本身最近 的“安全点”上主动中断挂起。
为何须要安全区域?
要是业务线程都不执行(业务线程处于 Sleep 或者是 Blocked 状态),那么程序就没办法进入安全点,对于这种状况,就必须引入安全区域。
安全区域是指可以确保在某一段代码片断之中, 引用关系不会发生变化,所以,在这个区域中任意地方开始垃圾收集都是安全的。咱们也能够把安全区城看做被扩展拉伸了的安全点。
当用户线程执行到安全区域里面的代码时,首先会标识本身已经进入了安全区域,这段时间里 JVM 要发起 GC 就没必要去管这个线程了。 当线程要离开安全区域时,它要 JVM 是否已经完成了(根节点枚举,或者其余 GC 中须要暂停用户线程的阶段)
一、若是完成了,那线程就看成没事发生过,继续执行。
二、不然它就必须一直等待, 直到收到能够离开安全区域的信号为止。.net
评论线程