垃圾回收中的安全点与安全区域

1. 垃圾回收中的安全点

安全点:程序执行过程中需要进行垃圾回收时,只有在特定的位置停顿下来开始进行GC,这些特定位置称之为安全点(Safepoint)。


Safepoint的选择很重要,如果太少可能导致GC等待用户线程执行的时间太长;如果太多,就是太频繁的执行GC,影响性能。大部分指令执行时间都非常短,通常会根据是否具有让程序长时间执行的特征为标准,比如选择一些执行时间较长的指令作为saftpoint,如方法调用、循环跳转和异常跳转等。

当多个用户线程正在执行时,此时如果要发生GC,如何检查所有用户线程都执行到了最近的安全点停顿下来了呢?分如下两种方式:

  • 抢先中断:GC发生时,首先中断所有的用户线程,如果有用户线程还未执行到安全点处,就恢复线程,让线程跑到安全点处。目前没有虚拟机采用此种形式;
  • 主动式中断:设置一个中断标志,各个线程执行到SafePoint的时候主动轮询这个标志,如果该标志为真,则将自己线程进行中断。

2. 垃圾回收中的安全区域

Safepoint保证了程序执行时,如果发生了GC,需等到程序执行到安全点处开始进入GC。但是如果程序没有执行时呢?比如线程处于sleep状态或blocked状态,此时线程无法响应JVM的中断请求,无法走到安全点去中断挂起线程,JVM也不太可能等待线程被唤醒,否则GC整个过程耗时过长,影响性能。鉴于这种情况,就可以用安全区域(Safe Region)来解决。
Safe Region指在一块代码片段中,对象的引用关系不会发生变化,不会影响到可达对象分析的准确性,这个区域中的任何位置开始GC都是安全的。也可以把Safe Region看做是扩展了的Safepoint。

实际执行时:

  1. 当线程运行到Safe Region代码时,首先标识已经进入Safe Region区域,如果在该区域执行期间发生了GC,JVM会忽略标识Safe Region状态的代码,即JVM执行GC垃圾清理工作,而Safe Region状态的线程也会继续执行,因为该线程不会改变GC ROOTS,不会影响垃圾回收。
  2. 当这个线程即将离开Safe Region区域时,会首先检查JVM是否已经完成GC,如果完成了,则该线程继续执行;如果未完成,该线程必须等待GC完成,等到收到可以安全离开Safe Region的信号为止。
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值