0
点赞
收藏
分享

微信扫一扫

【jvm047】程序不执行的时候如何到点安全点?

笑望叔叔 2022-03-31 阅读 28
jvmgitmysql

程序不执行的时候如何到点安全点?

安全点机制保证了程序执行时, 在不太长的时间内就会遇到可进入垃圾收集过程的安全点 。但是, 程序“不执行” 的时候呢? 所谓的程序不执行就是没有分配处理器时间, 典型的场景便是用户线程处于Sleep状态或者Blocked状 态, 这时候线程无法响应虚拟机的中断请求, 不能再走到安全的地方去中断挂起自己, 虚拟机也显然不可能持续 等待线程重新被激活分配处理器时间 。对于这种情况, 就必须引入安全区域 (Safe Region) 来解决。

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

当用户线程执行到安全区域里面的代码时, 首先会标识自己已经进入了安全区域, 那样当这段时间里虚拟机要发 起垃圾收集时就不必去管这些已声明自己在安全区域内的线程了 。 当线程要离开安全区域时, 它要检查虚拟机是 否已经完成了根节点枚举 (或者垃圾收集过程中其他需要暂停用户线程的阶段) , 如果完成了, 那线程就当作没 事发生过, 继续执行; 否则它就必须一直等待, 直到收到可以离开安全区域的信号为止。

举报

相关推荐

0 条评论