核心定位:不同GC针对不同场景优化(吞吐量 vs. 低延迟 vs. 大内存)。
注:CMS在JDK 9+已弃用,G1为默认推荐;ZGC/Shenandoah为现代低延迟方案(未详述,需额外配置)。
SerialGC
- 适用场景:小型应用、单CPU桌面环境(如开发测试)。
- 机制:
- 单线程,新生代(复制算法)、老年代(标记-整理)。
- STW(Stop-The-World)全程暂停应用。
- 特点:
- ✅ 低内存开销,简单高效。
- ❌ STW长(>1s),吞吐量低,不适用于生产环境。
- 启用:默认GC,无需参数(
-XX:+UseSerialGC)。
ParallelGC(Throughput GC)
- 适用场景:高吞吐量需求(如批处理、数据计算)。
- 机制:
- 多线程(新生代:Parallel Scavenge;老年代:Parallel Old)。
- 专注最大化吞吐量(减少GC时间占比)。
- 特点:
- ✅ 吞吐量高(CPU密集型场景最佳)。
- ❌ STW较短,但停顿时间仍较长(比CMS长)。
- 关键参数:
-XX:+UseParallelGC(新生代+老年代并行)。-XX:ParallelGCThreads=N(控制线程数,建议=CPU核心数)。
CMS(Concurrent Mark Sweep)
⚠️ JDK 9+已弃用,G1是其替代品。
- 适用场景:低延迟要求(如Web服务,停顿<200ms)。
- 机制:
- 并发标记-清除(仅初始标记+最终标记STW,其他阶段应用线程运行)。
- 依赖Remembered Set优化跨代引用。
- 特点:
- ✅ 低停顿(STW<100ms)。
- ❌ 碎片化严重(需
-XX:+UseCMSCompactAtFullCollection压缩);
❌ 需额外20%内存(并发阶段占用);
❌ Full GC仍STW长。
- 启用:
-XX:+UseConcMarkSweepGC。
G1 vs. 其他GC对比
| 特性 | SerialGC | ParallelGC | CMS | G1 |
|---|---|---|---|---|
| 核心目标 | 简单高效 | 高吞吐量 | 低延迟 | 平衡吞吐+低延迟 |
| STW停顿时间 | 长 (>1s) | 中 (100-500ms) | 短 (<200ms) | 极短 (<200ms) |
| 适用内存 | 小 (<4GB) | 中/大 | 中/大 | 超大 (>4GB) |
| 碎片化处理 | 标记-整理 | 标记-整理 | 无(需手动压缩) | 标记-整理(Region内) |
| JDK 9+推荐 | ❌ | ❌ | ❌(弃用) | ✅ 默认 |
关键结论:
- 生产环境优先选G1(平衡性最佳)。
- 旧系统遗留CMS需迁移到G1;新项目无需手动配置GC。