愿我所遇之人,所历之事,哪怕由于我有一点点变好,我就心满意足了。java
翻译自:JEP 333git
地址:openjdk.java.net/jeps/333github
Z垃圾收集器,也称为ZGC,是一个可伸缩的低延迟垃圾收集器。算法
注:此处及下文中的内存屏障即load barrier,在ZGC中用的是读屏障。bash
垃圾收集是Java的主要优点之一。可是,当垃圾收集暂停太长时,就会对应用程序的响应时间产生负面影响。经过大幅度缩短停顿时间,咱们可让Java适用于更多类型的应用程序。微信
此外,现代系统中可用的内存数量还在继续增加。用户和应用程序开发人员但愿JVM可以以一种有效的方式充分利用这种内存,而且不会出现很长的GC暂停时间。并发
ZGC是一个并发的、单代(再也不区分新生代和老年代)的、基于region的、支持numa的压缩收集器。Stop-the-world阶段仅限于根扫描,因此GC暂停时间不会随着堆或存活对象的多少而增长。less
ZGC的一个核心设计原则是结合使用内存屏障和彩色对象指针。这使得ZGC可以在运行Java应用程序线程时执行并发操做,好比对象重定位。从Java线程的角度来看,在Java对象中加载引用字段的行为受到内存屏障的限制。除了对象地址以外,有色对象指针还包含内存屏障须要的信息,用于肯定在容许Java线程使用该指针以前是否须要采起某些操做。例如,对象可能已经被从新定位,在这种状况下,内存屏障将检测状况并采起适当的操做。jvm
与其余技术相比,咱们认为颜色指针方案提供了一些很是吸引人的特性。特别是:ide
这容许咱们在移动对象/整理内存阶段,在指向可回收/重用区域的指针肯定以前回收/重用这部份内存【原文:It allows us to reclaim and reuse memory during the relocation/compaction phase, before pointers pointing into the reclaimed/reused regions have been fixed. 】。这有助于下降堆开销。这还意味着不须要实现单独的标记压缩算法来处理完整的GC。
这容许咱们使用相对较少且简单的GC屏障。这有助于下降运行时开销。这还意味着在解释器和JIT编译器中更容易实现、优化和维护GC barrier代码。
咱们目前将标记和从新定位相关信息存储在彩色指针中。然而,此方案的通用性容许咱们存储任何类型的信息(只要咱们能将其放入指针中),并容许内存屏障根据该信息采起它想要采起的任何操做。咱们相信这将为未来的许多特性打下基础。举一个例子,在异构内存环境中,这能够用来跟踪堆访问模式,以指导GC从新定位决策,将不多使用的对象移动到冷存储(不常访问的内存区域)中【原文:To pick one example, in a heterogeneous memory environment, this could be used to track heap access patterns to guide GC relocation decisions to move rarely used objects to cold storage.】。
咱们已经使用SPECjbb 2015[1]作了常规性能测试。从吞吐量和延迟角度来看,性能都很好。下面是使用128G堆在复合模式下比较ZGC和G1的典型基准分数(以百分比为单位,根据ZGC的max-jOPS进行标准化)【原文:Below are typical benchmark scores (in percent, normalized against ZGC’s max-jOPS), comparing ZGC and G1, in composite mode using a 128G heap.】:
越高越好
ZGC
max-jOPS: 100%
critical-jOPS: 76.1%
G1
max-jOPS: 91.2%
critical-jOPS: 54.7%
复制代码
下面是来自相同基准测试的GC暂停时间。ZGC设法保持远低于10ms的目标。注意,确切的数字可能会根据使用的机器和设置而变化(上下都有,但不是很明显)。
越低越好
ZGC
avg: 1.091ms (+/-0.215ms)
95th percentile: 1.380ms
99th percentile: 1.512ms
99.9th percentile: 1.663ms
99.99th percentile: 1.681ms
max: 1.681ms
G1
avg: 156.806ms (+/-71.126ms)
95th percentile: 316.672ms
99th percentile: 428.095ms
99.9th percentile: 543.846ms
99.99th percentile: 543.846ms
max: 543.846ms
复制代码
咱们还对其余各类SPEC®基准测试和内部工做负载进行了特别的性能测量。通常状况下,ZGC可以维护个位数的毫秒暂停时间。
ZGC的初始实验版本将不支持类卸载。默认状况下,classunload和ClassUnloadingWithConcurrentMark选项将被禁用。即使你启用也是不生效的。
此外,ZGC最初不支持JVMCI(即Graal)。若是启用EnableJVMCI选项,将打印一条错误消息。
这些限制将在本项目的后期解决。
按照惯例,构建系统默认禁用JVM中的实验性特性。ZGC是一个实验性特性,所以不会出如今JDK构建中,除非在编译时使用configure选项:
--with-jvm-features=zgc
复制代码
显式地启用它。
(ZGC将出如今Oracle发布的全部Linux/x64 JDK版本中)
JVM中的实验特性还须要在运行时显式地解锁。所以,要启用/使用ZGC,须要如下JVM选项:
-XX:+ unlockexperimental alvmoptions -XX:+UseZGC
复制代码
有关如何设置和调优ZGC的更多信息,请参阅ZGC项目Wiki(wiki地址:wiki.openjdk.java.net/display/zgc…
ZGC paper能够参考Azul Pauseless GC Algorithm:
ZGC 简介PPT:
我的微信公众号: