嘘~ 正在从服务器偷取页面 . . .

JVM LLGC:ZGC


jvm低延迟垃圾收集器 ZGC

EN: JVM Low-Latency Garbage Collector : Z Garbage Collector

一 、ZGC简介

一款在JDK 11中新加入的具有实验性质[插图]的低延迟垃圾收集器,是由Oracle公司研发的。2018年Oracle创建了JEP 333将ZGC提交给OpenJDK。

主要目标:

尽可能对吞吐量影响不太大的前提下,实现在任意堆内存大小下都可以把垃圾收集的停顿时间限制在十毫秒以内的低延迟。

演变简史:

Azul VM上的PGC(Pauseless GC) :

​ 实现了标记和整理阶段都全程与用户线程并发运行的垃圾收集。

Zing VM上的C4 (Concurrent Continuously Compacting Collector) :

​ 在PGC之上增加了分代收集支持,大幅提升了收集器能够承受的对象分配速度。Azul的C4收集器实现了分代收集后,能够应对的对象分配速率就比不分代的PGC收集器提升了十倍之多。

PGC——》C4——》ZGC

特征简介:

ZGC收集器是一款基于Region内存布局的,(暂时)不设分代的,使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记-整理算法的,以低延迟为首要目标的一款垃圾收集器。

二 ZGC主要特征:

(1)以低延迟为首要目标。

(2)暂不支持分代的,无跨代引用。

(3)基于Region的堆内存布局。

(4)染色指针和读屏障实现并发整理算法。Colored Pointer。

(5)内存多重映射技术。

(6)支持“NUMA-Aware”的内存分配。(NUMA非统一内存访问架构)

三 ZG内存布局

ZGC在x64硬件平台下的内存布局如图:

ZGC的堆内存布局(彩图)

ZGC的Region / Page / ZPage 称为 Size Groups ,

大致分三种类:

(A)小型Region(Small Region):容量固定为2MB,用于放置小于256KB的小对象。

(B)中型Region(Medium Region):容量固定为32MB,用于放置大于等于256KB但小于4MB的对象。

(C)大型Region(Large Region):容量不固定,可以动态变化,但必须为2MB的整数倍,用于放置4MB或以上的大对象。实际容量完全有可能小于中型Region,最小容量可低至4MB。大型Region在ZGC的实现中是不会被重分配。

四 并发整理实现:染色指针

染色指针技术(Colored Pointer 、Tag Pointer或者Version Pointer)是ZGC的标志性设计。

染色指针是一种直接将少量额外的信息存储在指针上的技术。在ZGC中使用染色指针直接把标记信息记在引用对象的指针上。

前提条件:内存多重映射(Multi-Mapping)技术。

染色指针带来的不利:

​ 染色指针有4TB的内存限制,不能支持32位平台,不能支持压缩指针。

染色指针带来的优势:

​ (1)染色指针可以使某个Region的存活对象被移走之后,该Region立即就能够被释放和重用掉。

​ (2)染色指针可以大幅减少在垃圾收集过程中内存屏障的使用数量。只使用了读屏障(染色指针+无分代引用)

​ (3)染色指针可以作为一种可扩展的存储结构用来记录更多与对象标记、重定位过程相关的数据,以便日后进一步提高性能。

五 ZGC收集工作过程

ZGC收集工作过程

ZGC收集工作全部四个阶段都是可以并发执行的。仅在两个阶段中间会存在短暂的停顿小阶段。

1 并发标记(Concurrent Mark)

(A)遍历对象图做可达性分析的阶段。(初始标记、最终标记)

(B)标记过程是面向全堆的,有短暂停顿。

(C)ZGC的标记不标记对象,会更新染色指针中的Marked 0、Marked 1标志位。

2 并发预备重分配(Concurrent Prepare for Relocate)

(A)统计要清理的Region/ size groups, 组成重分配集(Relocation Set)

(B)统计范围是面向全堆的。

(C)在JDK 12的ZGC中开始支持的类卸载以及弱引用的处理,也是在这个阶段中完成的。

3 并发重分配(Concurrent Relocate)

(A)是ZGC执行过程的核心阶段。

(B)把重分配集中的存活对象复制到新的Region上,并为重分配集中的每个Region维护一个转发表(Forward Table),记录从旧对象到新对象的转向关系。

(C)指针自愈(Self-Healing)

因为染色指针的支持,ZGC收集器能仅从引用上就明确得知一个对象是否处于重分配集之中,如果用户线程此时并发访问了位于重分配集中的对象,这次访问将会被预置的内存屏障所截获,然后立即根据Region上的转发表记录将访问转发到新复制的对象上,并同时修正更新该引用的值,使其直接指向新对象,ZGC将这种行为称为指针的“自愈”(Self-Healing)能力。

Shenandoah转发指针与ZGC染色指针比较:
    Shenandoah的Brooks转发指针每次都要转发。
    ZGC的染色指针可以指针自愈,只转发一次。

4 并发重映射(Concurrent Remap)

(A)修正整个堆中指向重分配集中旧对象的所有引用。(类似Shenandoah的引用更新)

(B)重映射清理这些旧引用的主要目的是为了不变慢,还可以释放转发表。

(C)并发重映射阶段要做的工作合并到下一次垃圾收集循环中的并发标记阶段里去完成。

六 ZGC优缺点

1.(与其他收集器相比)优点:

(1)动态的Region布局。

(2)无记忆集,不占大量内存。

(3)无分代,无卡表,无写屏障。(染色指针)

(4)支持“NUMA-Aware”的内存分配。NUMA(Non-Uniform Memory Access,非统一内存访问架构)是一种为多处理器或者多核处理器的计算机所设计的内存架构

2.(与其他收集器相比)缺点:

(1)堆空间较大时,并发收集的周期较长,浮动垃圾多,对象分配速率不会太高。

(2)需要较大的堆(Heap)容量。

七 性能及前景

目前处于测试阶段。ZGC与Parallel Scavenge、G1三款收集器通过SPECjbb 2015 的测试结果如下:

ZGC的吞吐量测试

ZGC的停顿时间测试

(1)ZGC的“弱项”吞吐量

在ZGC的“弱项”吞吐量方面,以低延迟为首要目标的ZGC已经达到了以高吞吐量为目标Parallel Scavenge的99%,直接超越了G1。如果将吞吐量测试设定为面向SLA(Service LevelAgreements)应用的“Critical Throughput”的话[插图],ZGC的表现甚至还反超了ParallelScavenge收集器。

(2)ZGC的强项停顿时间

ZGC的强项停顿时间测试上,它就毫不留情地与Parallel Scavenge、G1拉开了两个数量级的差距。不论是平均停顿,还是95%停顿、99%停顿、99.9%停顿,抑或是最大停顿时间,ZGC均能毫不费劲地控制在十毫秒之内。ZGC的停顿时间测试图中a)是ZGC的柱状条,b)纵坐标从线性尺度调整成对数尺度。

(3)将会成为服务端、大内存、低延迟应用的首选收集器的有力竞争者。



版权声明: 本博客所有文章除特別声明外,均采用 CC BY-SA 4.0 许可协议。转载请注明来源 Small-Rose / 张小菜 !
评论
  目录