bigywater.tech
Java · 210

Parallel GC:吞吐优先的并行垃圾收集器

Parallel GC 靠多线程并行回收追求吞吐。线程数到底有多大影响、吞吐真的比 G1 高吗、它的默认目标是什么?这篇用同一个存活集不断被替换的负载把这些量出来(G1 与 ZGC 的内部见前面的篇目)。

69.0 → 22.2 ms
Parallel GC 的 GC 线程 1 → 8 个时,年轻代停顿的中位数
395,987 vs 456,530
这个负载下 6 秒内完成的循环数:Parallel vs G1
99
默认 GCTimeRatio(目标 GC 时间占 1%)

GC 线程数

实测 · 本机执行输出
 ParallelGCThreads   GC 次数       停顿中位数(ms)    最大(ms)     总停顿(ms)     循环完成数
                 1      49            69.0     338.3        4398    199950
                 2      69            43.5     181.2        3609    289246
                 4      85            25.8     138.5        2965    363934
                 8      89            22.2     125.2        2808    382856

三种回收器对比

实测 · 本机执行输出
回收器            循环完成数   GC 次数       停顿中位数(ms)    最大(ms)     总停顿(ms)    停顿占比
Parallel      395987      80            23.8     123.1        2704   45.1%
G1            456530     114            12.5      99.6        2019   33.6%
Serial        196885      24           182.3     465.3        4630   77.2%

默认参数

实测 · 本机执行输出
  GCTimeRatio = 99
  InitialSurvivorRatio = 8
  MaxGCMinorPauseMillis = 18446744073709551615
  MaxGCPauseMillis = 18446744073709551614
  NewRatio = 2
  ParallelGCThreads = 9
  SurvivorRatio = 8
  UseAdaptiveSizePolicy = true

分步演示

Parallel GC
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / OpenJDK(Temurin 17.0.20、Homebrew 21.0.12 与 27,每篇注明实际用的版本);用 javac 编译、java 直接运行,需要第三方库时用 Maven 解析依赖;计时用 System.nanoTime,数字每次运行会有小幅抖动。JDK 21.0.12,10 核 macOS,堆 2 GB;负载是自写的「大存活集不断替换」循环
    • 没有验证:其它负载(存活集很小、分配以大对象为主)下 Parallel 与 G1 的吞吐对比、-XX:MaxGCPauseMillis 与 GCTimeRatio 调整后的自适应行为、老年代的并行 Full GC 停顿、NUMA 感知;每组只运行了一次 6 秒
    京ICP备2026067502号-1京公网安备11010502063487号