ezra-sullivan
发布于 2025-04-01 / 10 阅读
0
0

JVM 垃圾收集器(GC)选择指南

更新时间:2025 年 5 月

垃圾收集器(GC)分类

JVM 的主要垃圾收集器(Garbage Collectors, GC)分为以下三类

  • 吞吐量优先型(Throughput)
  • 响应时间优先型(低停顿)
  • 低延迟型(Low Latency)

分类及对比

名称适用版本大类类型特点优点缺点
Serial GC
(-XX:+UseSerialGC)
所有版本---单线程单线程处理所有 GC 阶段简单、适合小内存吞吐低,暂停长
Parallel GC
(-XX:+UseParallelGC)
默认 GC(JDK 8)吞吐量优先型
(Throughput)
多线程多线程 YGC/FGC吞吐高,适合批处理停顿时间不可预测
CMS GC
(-XX:+UseConcMarkSweepGC)
JDK 9 之前流行响应时间优先型(低停顿)并发收集老年代减少老年代停顿停顿短,响应快内存碎片化,已废弃(JDK 14)
G1 GC
(-XX:+UseG1GC)
JDK 9+ 默认响应时间优先型(低停顿)分区/并发分区处理内存,低停顿响应时间可控配置复杂,吞吐略低
ZGC
(-XX:+UseZGC)
JDK 11+低延迟型
(Low Latency)
并发停顿时间极低(<10ms)超低停顿,支持大堆吞吐一般,JDK 限制多
Shenandoah
(-XX:+UseShenandoahGC)
JDK 12+低延迟型
(Low Latency)
并发类似 ZGC,低停顿响应快,适合交互型应用吞吐略低

推荐场景

场景推荐 GC
小内存应用(<2G)或单核系统SerialGC
高吞吐批处理系统ParallelGC
对延迟敏感的应用(Web服务)G1GC / ZGC / Shenandoah
超大堆内存(>32G)ZGC
需要可预测停顿G1GC
老项目 / 兼容性要求CMS(仅限旧版本)

示例

启用 G1 GC 并设定最大停顿时间

java -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar app.jar

JDK 与 GC 支持对照

对照表

GC 名称JDK 8JDK 9JDK 11JDK 14JDK 17JDK 21(LTS)状态说明
Serial GC一直可用,适用于小堆
Parallel GC
(Default in JDK 8)

(Default)
吞吐量优先,仍常用
CMS GC⚠️
Deprecated
⚠️
Deprecated

Removed
从 JDK 14 起彻底移除
G1 GC
(Default in JDK 9+)

(Default)
JDK 9+ 默认 GC
ZGC
(实验性)

(实验性)
JDK 15+ 成为正式稳定特性
Shenandoah GC
(需特定发行版)

(OpenJDK by Red Hat)
Red Hat 主导,需使用支持版 OpenJDK(如 Adoptium)
Epsilon GC(空 GC)
(实验性)
用于性能测试,跳过回收

说明

  • ✅:支持
  • ❌:不支持 / 已移除
  • ⚠️:已弃用(Deprecated),将被移除
  • 默认 GC:
    • JDK 8:ParallelGC
    • JDK 9+:G1GC

建议策略

使用目标建议 GC推荐 JDK 版本
容器化/服务端G1GCJDK 11+
低延迟、大内存(>32G)ZGC / ShenandoahJDK 17+
批处理/高吞吐任务ParallelGCJDK 8+
测试或快速失败实验EpsilonGCJDK 11+

容器化推荐

容器化环境中推荐使用 G1GC(Garbage-First Garbage Collector)

原因:适应容器资源限制 + 可控的低停顿特性

详细原因

  1. 低停顿,响应稳定
    • G1GC 将内存划分为多个小区域(Region),可以并行、增量地收集
    • 可以通过 -XX:MaxGCPauseMillis 控制目标最大停顿时间(例如 200ms),适合容器内运行的 Web 服务、微服务等交互型场景
  2. 支持自动感知容器内存限制(JDK 10+)
    • 搭配 -XX:MaxRAMPercentage,G1GC 会根据容器分配的内存自动计算合理的堆大小,而不需要手动设置 -Xmx
    • 避免 OOM 或资源浪费,在 Kubernetes、Docker 等容器平台中表现良好
  3. 并发回收,避免 Full GC 带来的长时间 STW(Stop The World)
    • 老年代也是并发回收,而不像 CMS 那样容易触发 Full GC
  4. 易于调优
    • 参数如 -XX:InitiatingHeapOccupancyPercent(何时触发 GC) 和 -XX:MaxGCPauseMillis 控制简单
    • 相比 CMS、ZGC、Shenandoah,调优曲线更成熟、广泛部署验证过
  5. 默认 GC(JDK 9+)
    • G1 已成为 JDK 官方推荐默认收集器,在容器中稳定性高
  6. 兼容性强,JDK 8 也支持
    • 即便使用 JDK 8,也可通过 -XX:+UseG1GC 显式开启

示例-容器场景 JVM 参数组合

java \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  -XX:InitialRAMPercentage=10.0 \
  -XX:MaxRAMPercentage=75.0 \
  -XX:+PrintGCDetails -Xloggc:/logs/gc.log \
  -jar app.jar

GC 选择决策树

graph TD
    O[开始选择] --> A[是否需要亚毫秒级停顿?]
    A -->|是| B[堆大小是否 >32GB?]
    B -->|是| C[ZGC(JDK 17+)]
    B -->|否| D[Shenandoah </br>(需兼容性验证)]
    A -->|否| E[是否需要高吞吐?]
    E -->|是| F[Parallel GC]
    E -->|否| G[G1(默认推荐)]


评论