Java垃圾回收的安全点和安全区域

Java垃圾回收的安全点和安全区域

安全点

程序执行时并非在所有地方都能停下来开始垃圾回收(GC),只有在特定的位置才能停下来开始GC,这些位置称为“安全点(Safepoint)”。

如何选择安全点呢?

如果安全点太少了,就会导致GC等待时间太长,容易引发内存溢出。如果安全点过多可能会导致运行时的性能问题。通常会根据“是否具有让程序长时间执行的特征”为标准,比如选择一些执行时间长的指令作为Safe Point,如方法调用、循环跳转、异常跳转。、

通常在执行GC时,会引发STW现象,那么如何在GC发生时,让所有的线程都跑到最近的安全点停顿下来呢?

  • 抢占式中断(目前没有虚拟机采用了)

    首先中断所有的线程,如果还有线程不在安全点,就恢复线程,让线程跑到安全点。

  • 主动式中断

    设置一个中断标志,各个线程运行到Safe point的时候主动轮询这个标志,如果中断标志为真,则将自己进行中断挂起。

安全区域

Safepoint机制保证了程序执行时,在不长的时间内就会遇到可进入GC的Safepoint。但是,程序‘’不执行‘’的时候呢?所谓不执行就是程序没有分配CPU时间,典型的例子就是线程处于Sleep状态或者Blocked状态,这时候线程无法响应JVM的中断请求,‘’走“到安全的地方去中断挂起,JVM也显然不太可能等待线程重新分配CPU时间,对于这种状况,就需要安全区域来解决。

安全区域是指一段代码片段之中,引用关系不会发生变化,在这个区域中的任何位置开始GC都是安全的。

当线程运行到Safe Region的代码时,首先标识已经进入了Safe Region,如果这段时间内发生GC,JVM会忽略标识为Safe Region状态的线程;当线程即将离开Safe Region时, 会检查JVM是否已经完成GC,如果完成了,则继续运行,否则线程必须等待直到收到可以安全离开SafeRegion的信号为止。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值