ZGC 为什么能做到几乎没有停顿?代价是什么?这篇用同一个程序在三种回收器、不同堆大小、不同存活集上量应用真正被打断的时间,再看 ZGC 一次回收的阶段(G1 的 Region 与停顿目标见前面的篇目,彩色指针在后面)。
回收器 存活集 日志里最长停顿(ms) 程序看到的最长间隔(ms) >5 ms 的间隔次数 循环次数 日志里的 Allocation Stall 行 Parallel -Xmx2g ≈40 MB 15.70 15.78 114 1043026 0 Parallel -Xmx2g ≈400 MB 260.44 260.54 52 205354 0 G1 -Xmx2g ≈40 MB 5.95 6.01 18 1138758 0 G1 -Xmx2g ≈400 MB 84.17 88.60 65 245734 0 ZGC -Xmx1g ≈40 MB 0.02 17.47 40 836341 121 ZGC -Xmx1g ≈400 MB 0.01 85.43 28 218739 84 ZGC -Xmx2g ≈40 MB 0.01 0.63 0 913754 0 ZGC -Xmx2g ≈400 MB 0.01 0.49 0 275185 0 ZGC -Xmx4g ≈40 MB 0.01 1.10 0 892858 0 ZGC -Xmx4g ≈400 MB 0.01 0.63 0 272257 0
Pause Mark Start 0.003ms Concurrent Mark 96.250ms Pause Mark End 0.007ms Concurrent Mark Free 0.000ms Concurrent Process Non-Strong References 0.148ms Concurrent Reset Relocation Set 0.008ms Concurrent Select Relocation Set 2.479ms Pause Relocate Start 0.003ms Concurrent Relocate 30.033ms