java虚拟机--低延迟垃圾收集器(Shenandoah收集器)

  • Shenandoah收集器是由RedHat公司开发的项目,Oracle拒绝在OracleJDK12中支持该收集器,Shenandoah只有在OpenJDK中才会包含,而OracleJDK中不包含的。
  • 该收集器的目标:无论堆的大小如何,都可以把垃圾收集器的停顿时间限制在10ms以内。
Shenandoah工作过程
  • (1)初始标记
    标记GC Roots直接引用的对象。
    需要stop the world,时间长度取决于GC Roots的多少。
  • (2)并发标记
    从GC Roots直接引用的对象出发,进行可达性分析,遍历整个对象图,标记存活的对。
    与用户线程并发执行,时间长短取决于存活的对象的多少,以及对象图结构的复杂度。
  • (3)最终标记
    Shenandoah收集器在并发标记阶段采用原始快照避免并发标记阶段由于用户线程的执行导致引用发生变化出现的标记错误。
    该阶段处理剩余的SATB(原始快照)扫描,并计算回收价值最高的Region,构成一组回收集。
    需要Stop the World.
  • (4)并发清理
    在回收集中找出一个存活对象都没有的Region,并且进行清理这些Region中的内存。
  • (5)并发回收
    把回收集中存活的对象复制一份到其他没有被使用的Region中。
  • 初始引用更新
    该阶段没有做实际工作,设立该阶段是为了建立一个线程集合点,确保所有并发回收阶段的线程都已经完成了任务。
  • (6)并发引用更新
    回收集中存活的旧对象被复制到新的Region中后,需要把堆中所有指向该旧对象的引用修正到复制后的新地址。
    具体方式:按照内存物理地址的顺序,线性搜索出引用类型,把旧值该为新值。
  • (7)最终引用更新
    上面的并发引用更新更新的是堆中的引用,还需要把GC Roots(方法区(常量、惊天变量)、虚拟机栈(局部变量,参数,临时变量)、本地方法栈)中的引用进行修正。
  • (8)并发清理
    经过并发回收、索引更新后,回收集中已经没有了存活的对象,垃圾收集线程对回收集中的所有Region进行回收。
    整个过程可以简单记为:标记存活对象(并发)–>确定回收集–>复制回收集中存活队形(并发,将回收集中的存活对象移出)–>更新相关的引用(并发)–>清理整个回收集
转发指针(Brooks Pointer)

并发回收阶段,由于回收线程与用户线程并发工作,那么移动回收集中存活对象的同时,用户线程仍然可能不停对被移动的对象进行读写访问,但是对象被移动后整个内存中所有指向该对象的引用都还是旧对象的地址(旧对象是要被清除的,必须保证用户线程对移动后的对象进行访问)。
解决方案:通过读屏障和转发指针来解决。

  • 转发指针的工作原理
    在对象的对象头上增加一个引用字段(类似于句柄,reference字段中就存放新增的引用字段的地址,然后通过这个新增的引用字段的指向访问到对象),正常情况下指向自己。
    新增的这个引用字段,就是转发指针。当对象拥有了一份新的副本,只需要将该转发指针的值指向新对象,这样将所有对该对象的访问转发到新的副本上。只要就对象的没有被清理掉,虚拟机内存中所有通过旧引用地址访问的代码便仍然可用,都会被自动转发到新对象上继续工作
  • 转发指针带来的问题及解决
    • 线程安全问题
      线程安全性发生的场景
      (1)收集器线程将一个对象复制到新的Region中(此时还没有把就对象的转发指针改为指向新的副本)
      (2)用户线程更新对象的某个字段
      (3)收集器线程更新就对象的转发指针,使其指向新对象
      如果用户线程和收集器线程发生如上的执行顺序,那么导致用户线程只是对就对象进行了写操作,没办法体现在新对象上。因此对转发指针的访问操作采取同步措施,即(1)(3)的操作必须必须原子进行。实际上这里对转发指针的同步措施是CAS(即用户获得转发指针–》更改对象字段–》检查目前转发指针是否等于之前获得的转发指针–》(1)是:更改成功;(2)否:重新获得指针,进行更改)。
    • 执行效率问题
      为了实现转发指针,Shenandoah在读写屏障中都加入了额外的转发处理器,读屏障的代价比写屏障大,因为对一个对象的读操作要比写操作多很多,故读屏障要多很多。
      JDK13中将Shenandoah的内存屏障模型改进为基于引用访问屏障的实现,即内存屏障只拦截对象中数据类型为引用类型的读写操作。
G1与Shenandoah的相似与不同
  • 相同点
    基于Region的堆内存布局、大对象存放在特殊的Region中(Humongous Region)、默认的回收策略:有限回收回收价值大的Region。
  • 不同点
    (1)支持并发的整理算法(Shenandoah通过转发指针和读屏障来试下并发整理)。在G1中,在进行筛选回收时,必须Stop the world,将回收集合中的存活对象复制到空的Region中。而Shenandoah收集器,在进行复制的过程中可以与用户线程并发执行。
    (2)Shenandoah默认不适用分代收集
    (3)Shenandoah中摒弃了Region中存放跨代指针的记忆集。而该为链接矩阵,可以理解为一个二维表,如果Region N有对象指向Region M,就在表格N行M列中打上标记。在进行可达性分析时,遍历这个表格就知道哪些Region中有跨代引用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值