枚举根节点流程

stop the world:垃圾回收器在进行GC时会停止其他用户线程,避免在进行垃圾回收时再产生垃圾。

安全点:用户线程并不是刻意随时停下来的,而是在特定的位置停下来,即安全点。

安全区域(safe Region):部分用户线程处于阻塞状态(即Sleep或Blocked),在这个区域中的任意地方开始GC都是安全的。可以把Safe Region看做是被扩展了的Safepoint。

因为“stop the world”的原因,可达性分析算法不可能遍历整个引用链,遍历了就太慢了用户体验会极差的,更何况现在很多应用仅仅方法区就有数百兆。因此虚拟机通过OopMap这种数据结构直接得知哪些地方存放着对象的引用。在OopMap的协助下,HotSpot可以快速且准确地完成GC Roots枚举,同时OopMap在记录数据时并不是每条指令都对应一个OopMap,而是在安全点位置记录数据。因此,用户线程必须进入安全点后才会创建该段程序对应的OopMap数据,而GC有两种方式告诉所有用户线程到安全点停下的方式,一种是抢占式中断,另一种是主动式中断。其中主动式中断在虚拟机中常用,即GC要垃圾回收时会给出一个标志,告诉所有用户线程要进行垃圾回收了,然后用户线程发现垃圾回收标志变了要开始垃圾回收了,就会在下一次进入安全点时停顿下来并生成对应的OopMap数据,停顿下来后会给自己一个标志,告诉GC垃圾回收器我已经进入安全点了。部分阻塞的线程无法进入安全点给自己一个Safe Region标志,这个GC垃圾回收时就会认定标志为Safe Region的线程是安全的。然后等待所有用户线程进入了安全点后就开始GC垃圾回收了。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值