安全点与安全区域

1、安全点(safepoint)

程序执行时并非在所有地方都能停顿下来开始GC,只有在特定的位置才可以停顿

安全点的选择很重要,如果太少可能导致GC等待时间长,如果太多则会导致用户线程运行性能低。所以一般安全点会选取程序执行时间较长的指令时刻。比如选取方法调用,循环跳转和异常跳转。

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

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

(2)主动式中断

设置一个中断标识,各个线程运行到安全点的时候主动轮询这个标识,如果出现中断标识为真,则将自己进行中断挂起。

2、安全区域

如果线程处于sleep状态或者阻塞状态,这是线程无法响应jvm的中断请求,即无法到安全点主动挂起。此时就需要安全区域来解决。

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

当程序运行到安全区域的代码时,首先标识已经进入安全区域,如果这段时间发生GC,jvm会忽略标识为安全区域的线程。

当线程离开安全区域时,会检测jvm释放已经完成GC,如果完成,则继续运行,否则线程必须等待直到收到可以离开安全区域的信号为止。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值