JVM-可达性分析算法

本文探讨了垃圾回收中的可达性分析问题,包括其带来的GC停顿问题、枚举根节点的过程、安全点的选择及其实现机制,以及安全区域的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可达性分析的问题
1、消耗大量时间
      从前面可达性分析知道,GC Roots主要在全局性的引用(常量或静态属性)和执行上下文中(栈帧中的本地变量表);
      要在这些大量的数据中,逐个检查引用,会消耗很多时间;
2、GC停顿
      可达性分析期间需要保证整个执行系统的一致性,对象的引用关系不能发生变化;
      导致GC进行时必须停顿所有Java执行线程(称为"Stop The World");
      (几乎不会发生停顿的CMS收集器中,枚举根节点时也是必须要停顿的)
      Stop The World:
      是JVM在后台自动发起和自动完成的;
      在用户不可见的情况下,把用户正常的工作线程全部停掉;
3-2、枚举根节点
      枚举根节点也就是查找GC Roots;
      目前主流JVM都是准确式GC,可以直接得知哪些地方存放着对象引用,所以执行系统停顿下来后,并不需要全部、逐个检查完全局性的和执行上下文中的引用位置;
            
      在HotSpot中,是使用一组称为OopMap的数据结构来达到这个目的的;
      在类加载时,计算对象内什么偏移量上是什么类型的数据;
      在JIT编译时,也会记录栈和寄存器中的哪些位置是引用;
      这样GC扫描时就可以直接得知这些信息;
3-3、安全点
1、安全点是什么,为什么需要安全点
      HotSpot在OopMap的帮助下可以快速且准确的完成GC Roots枚举,但是这有一个问题:        
      运行中,非常多的指令都会导致引用关系变化
      如果为这些指令都生成对应的OopMap,需要的空间成本太高
      问题解决:
      只在特定的位置记录OopMap引用关系,这些位置称为安全点(Safepoint)
      即程序执行时并非所有地方都能停顿下来开始GC
2、安全点的选定
      不能太少,否则GC等待时间太长;也不能太多,否则GC过于频繁,增大运行时负荷;
      所以,基本上是以程序"是否具有让程序长时间执行的特征"为标准选定;
      "长时间执行"最明显的特征就是指令序列复用,如:方法调用、循环跳转、循环的末尾、异常跳转等;
      只有具有这些功能的指令才会产生Safepoint;
3、如何在安全点上停顿
      对于Safepoint,如何在GC发生时让所有线程(不包括JNI线程)运行到其所在最近的Safepoint上再停顿下来?
      主要有两种方案可选:
(A)、抢先式中断(Preemptive Suspension)
      不需要线程主动配合,实现如下:
      (1)、在GC发生时,首先中断所有线程;
      (2)、如果发现不在Safepoint上的线程,就恢复让其运行到Safepoint上;
      现在几乎没有JVM实现采用这种方式;
(B)、主动式中断(Voluntary Suspension)
      (1)、在GC发生时,不直接操作线程中断,而是仅简单设置一个标志
      (2)、让各线程执行时主动去轮询这个标志,发现中断标志为真时就自己中断挂起;
      而轮询标志的地方和Safepoint是重合的;    
      在JIT执行方式下:test指令是HotSpot生成的轮询指令;
      一条test汇编指令便完成Safepoint轮询和触发线程中断;
3-4、安全区域
1、为什么需要安全区域
      对于上面的Safepoint还有一个问题:
      程序不执行时没有CPU时间(Sleep或Blocked状态),无法运行到Safepoint上再中断挂起;    
      这就需要安全区域来解决;
2、什么是安全区域(Safe Region)
      指一段代码片段中,引用关系不会发生变化;
      在这个区域中的任意地方开始GC都是安全的;
3、如何用安全区域解决问题
      安全区域解决问题的思路:
      (1)、线程执行进入Safe Region,首先标识自己已经进入Safe Region;
      (2)、线程被唤醒离开Safe Region时,其需要检查系统是否已经完成根节点枚举(或整个GC);
      如果已经完成,就继续执行;
      否则必须等待,直到收到可以安全离开Safe Region的信号通知;    
这样就不会影响标记结果;
      虽然HotSpot虚拟机中采用了这些方法来解决对象可达性分析的问题,但只是大大减少了这些问题影响,并不能完全解决,如GC停顿"Stop The World"是垃圾回收重点关注的问题,后面介绍垃圾回收器时应注意:低GC停顿是其一个关注。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值