学习JVM之垃圾收集器 ——Shenandoah收集器简单介绍

10 篇文章 0 订阅
10 篇文章 0 订阅

低延迟垃圾收集器主要有这两款:

Shenandoah收集器 和 官方推出的ZGC收集器

Shenandoah

简单介绍

Shenandoah并不是官方推出的,但是比ZGC收集器更像是G1收集器的下一代。
首先,采用基于Region的堆内存布局。
其次,拥有存放大对象的 Humongous Region。
而且,使用有先处理回收价值最大的默认回收策略。
那么与G1的不同点呢?
  1. 支持并发的整理算法
  2. 默认不分代
  3. 使用叫做连接矩阵的全局数据结构记录跨Region的引用关系。

不分代,是出于性价比的考量。

连接矩阵可以看作一张二维表,如果Region n有对象指向Region m,就在表格的n行m列中打上一个标记。通过这样的标记来判定Region之间的引用关系。

工作过程

1.        初始标记:与G1一样,首先标记与GC Roots直接关联的对象,这个阶段仍 是“Stop The World”的,但停顿时间与堆大小无关,只与GC Roots的数量相关。

2.        并发标记:与G1一样,遍历对象图,标记出全部可达的对象,这个阶段是与用户线程一起并发的,时间长短取决于堆中存活对象的数量以及对象图的结构复杂程度。

3.        最终标记:与G1一样,处理剩余的SATB扫描,并在这个阶段统计出回收价值最高Region,将这些Region构成一组回收集。最终标记阶段也会有一小段短暂的停顿。

4.        并发清理:这个阶段用于清理那些整个区域内连一个存活对象都没有找到的Region。

5.        并发回收:并发回收阶段是Shenandoah与之前HotSpot中其他收集器的核心差异。在这个阶段,Shenandoah要把回收集里面的存活对象先复制一份到其他未被使用的Region之中。并发回收阶段运行的时间长短取决于回收集的大小。

6.        初始引用更新:并发回收阶段复制对象结束后,还需要把堆中所有指向旧对象的引用修正到复制后的新地址,这个操作称为引用更新。引用更新的初始化阶段实际上并未做什么具体的处理,设立这个阶段只是为了建立一个线程集合点,确保所有并发回收阶段中进行的收 集器线程都已完成分配给它们的对象移动任务而已。会产生一个非常短暂的停顿。

7.        并发引用更新:真正开始进行引用更新操作,这个阶段是与用户线程一起并发的,时间长短取决于内存中涉及的引用数量的多少。并发引用更新与并发标记不同,它 不再需要沿着对象图来搜索,只需要按照内存物理地址的顺序,线性地搜索出引用类型,把旧值改为新值即可。

8.        最终引用更新:解决了堆中的引用更新后,还要修正存在于GC Roots 中的引用。这个阶段是Shenandoah的最后一次停顿,停顿时间只与GC Roots的数量相关。

9.        并发清理:经过并发回收和引用更新之后,整个回收集中所有的Region已再无存活对象,最后再调用一次并发清理过程来回收这些Region的内存空间,供以后新对象分配使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值