低延迟垃圾收集器主要有这两款:
Shenandoah收集器 和 官方推出的ZGC收集器
Shenandoah
简单介绍
- 支持并发的整理算法
- 默认不分代
- 使用叫做连接矩阵的全局数据结构记录跨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的内存空间,供以后新对象分配使用。