赞
踩
总结: 程序在执行的时候,并非在任何时候都可以停下来GC的,因此需要设置安全点,只有到达安全点,才可以进行GC。 而安全点的选择也需要考虑,如果设置的安全点太少,这GC时所需要的等待的时间就会太长,如果设置的安全点太多,又会导致程序执行时间太短。 通常会根据“是否具有让程序长时间执行的特征”为标准,比如选择一些执行比较长的指令作为安全点,如方法调用,循环跳转,异常跳转。 如何在GC发生时,检查所有线程都跑到最近的安全点停顿下来呢? 1、抢断式中断:(目前没有虚拟机采用该方式)首先中断所有线程,如果有线程还没到安全点,则恢复线程,让其跑到安全点。 2、主动式中断:设置一个中断标志,每当线程跑到安全点,则轮询该标志,如果为真,则线程中断挂起。 采用上面方法2的时候会存在一个问题: 那就是线程都是需要主动跑到安全点的,但是有的线程却无法跑到安全点,比如处于Sleep或Blocked状态的线程。 解决方案: 这就需要安全区域(Safe Region)来保证了。 安全区域是指在一段代码片段中,对象的引用关系不会发生改变,也就是说在该区域内的任何位置,GC都是安全的。 可以把安全区域看成是放大了之后的安全点。 当线程走到安全区域时,会标识已经进入到安全区域。如果在这段时间内发生GC,则JVM会忽略这部分线程。即这些线程Stop The World,等待GC结束。 如果线程即将离开安全区域时,会先去检查JVM是否GC完毕,如果GC还没结束,则等待结束后才继续执行。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。