更新时间: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 8 | JDK 9 | JDK 11 | JDK 14 | JDK 17 | JDK 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
- JDK 8:
建议策略
使用目标 | 建议 GC | 推荐 JDK 版本 |
---|---|---|
容器化/服务端 | G1GC | JDK 11+ |
低延迟、大内存(>32G) | ZGC / Shenandoah | JDK 17+ |
批处理/高吞吐任务 | ParallelGC | JDK 8+ |
测试或快速失败实验 | EpsilonGC | JDK 11+ |
容器化推荐
容器化环境中推荐使用 G1GC(Garbage-First Garbage Collector)
原因:适应容器资源限制 + 可控的低停顿特性
详细原因
- 低停顿,响应稳定
- G1GC 将内存划分为多个小区域(Region),可以并行、增量地收集
- 可以通过
-XX:MaxGCPauseMillis
控制目标最大停顿时间(例如200ms
),适合容器内运行的 Web 服务、微服务等交互型场景。
- 支持自动感知容器内存限制(JDK 10+)
- 搭配
-XX:MaxRAMPercentage
,G1GC 会根据容器分配的内存自动计算合理的堆大小,而不需要手动设置-Xmx
- 避免 OOM 或资源浪费,在 Kubernetes、Docker 等容器平台中表现良好
- 搭配
- 并发回收,避免 Full GC 带来的长时间 STW(Stop The World)
- 老年代也是并发回收,而不像 CMS 那样容易触发 Full GC
- 易于调优
- 参数如
-XX:InitiatingHeapOccupancyPercent
(何时触发 GC) 和-XX:MaxGCPauseMillis
控制简单 - 相比 CMS、ZGC、Shenandoah,调优曲线更成熟、广泛部署验证过
- 参数如
- 默认 GC(JDK 9+)
- G1 已成为 JDK 官方推荐默认收集器,在容器中稳定性高
- 兼容性强,JDK 8 也支持
- 即便使用 JDK 8,也可通过
-XX:+UseG1GC
显式开启
- 即便使用 JDK 8,也可通过
示例-容器场景 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(默认推荐)]