当前位置:   article > 正文

JVM垃圾回收安全点Safe Point

垃圾回收安全点

JVM垃圾回收安全点Safe Point

总结:
程序在执行的时候,并非在任何时候都可以停下来GC的,因此需要设置安全点,只有到达安全点,才可以进行GC。

而安全点的选择也需要考虑,如果设置的安全点太少,这GC时所需要的等待的时间就会太长,如果设置的安全点太多,又会导致程序执行时间太短。
通常会根据“是否具有让程序长时间执行的特征”为标准,比如选择一些执行比较长的指令作为安全点,如方法调用,循环跳转,异常跳转。

如何在GC发生时,检查所有线程都跑到最近的安全点停顿下来呢?
1、抢断式中断:(目前没有虚拟机采用该方式)首先中断所有线程,如果有线程还没到安全点,则恢复线程,让其跑到安全点。
2、主动式中断:设置一个中断标志,每当线程跑到安全点,则轮询该标志,如果为真,则线程中断挂起。

采用上面方法2的时候会存在一个问题:
那就是线程都是需要主动跑到安全点的,但是有的线程却无法跑到安全点,比如处于Sleep或Blocked状态的线程。

解决方案:
这就需要安全区域(Safe Region)来保证了。
安全区域是指在一段代码片段中,对象的引用关系不会发生改变,也就是说在该区域内的任何位置,GC都是安全的。
可以把安全区域看成是放大了之后的安全点。

当线程走到安全区域时,会标识已经进入到安全区域。如果在这段时间内发生GC,则JVM会忽略这部分线程。即这些线程Stop The World,等待GC结束。
如果线程即将离开安全区域时,会先去检查JVM是否GC完毕,如果GC还没结束,则等待结束后才继续执行。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/930944
推荐阅读
相关标签
  

闽ICP备14008679号