仓库源文站点原文


layout: post title: "令人惊叹的ZGC" categories: Java tags: jvm gc

author: 张乘辉

特性

据官方说:ZGC项目需要完成的目标是:控制Java的垃圾回收时长在10ms以内,绝对不超过10ms,并且使用了该垃圾回收策略之后,吞吐对比当前Java缺省的垃圾回收策略G1,下降不超过15%

总的来说,ZGC主要有以下目标:

  1. GC 停顿时间不超过10ms
  2. 停顿时间不随heap大小或存活对象大小增大而增大
  3. 可以处理从几百兆到几T的内存大小

我们先来看一张对比图:

zgc

再从官方得出的一个测试:

128G 的堆,复合模式下的性能,看 GC 停顿时间:

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

这就够惊叹了,竟然在 128g 的堆内存中,gc 停顿不超过 2ms,远远低于官方保守的 10ms!

它为什么这么快?其实有原因的,我从官方描述里总结了以下几点:

总结 ZGC 的 STW 为什么这么短的原因就是:仅root扫描时STW,其他标记、清理、迁移阶段,均通过colored oops和load-barrier配合使用,并发执行。

使用参数:

-XX:+UnlockExperimentalVMOptions -XX:+UseZGC

因为ZGC还处于实验阶段,所以需要通过JVM参数UnlockExperimentalVMOptions 来解锁这个特性。