收集器 | 适用区域 | 特点 | 适用场景 |
---|---|---|---|
Serial | 新生代 | 单线程,STW(Stop-The-World) | 客户端小应用 |
Parallel Scavenge | 新生代 | 多线程,吞吐量优先 | 后台计算任务 |
ParNew | 新生代 | Serial 的多线程版 | 配合 CMS 使用 |
CMS | 老年代 | 并发标记,低延迟 | 响应优先的系统 |
G1 | 全堆 | 分区域回收,平衡吞吐/延迟 | JDK9+ 默认 |
ZGC | 全堆 | 超低延迟(<10ms) | 超大堆应用 |
1. Serial 收集器
-
特点:单线程、STW(Stop-The-World)
-
区域:新生代(复制算法)
-
适用场景:客户端模式(如
-client
)、单核CPU -
参数:
-XX:+UseSerialGC
总结:简单高效,但停顿时间长。
2. ParNew 收集器
-
特点:Serial 的多线程版本
-
区域:新生代(复制算法)
-
适用场景:配合CMS使用(JDK8及之前)
-
参数:
-XX:+UseParNewGC
总结:多线程提升GC效率,但仍有STW。
3. Parallel Scavenge(吞吐量优先)
-
特点:多线程、关注吞吐量(
吞吐量 = 用户代码时间 / (用户代码时间 + GC时间)
) -
区域:新生代(复制算法)
-
适用场景:后台计算型任务(如批量处理)
-
参数:
-XX:+UseParallelGC
总结:适合不关心延迟,追求高吞吐的场景。
4. Serial Old 收集器
-
特点:Serial 的老年代版本
-
区域:老年代(标记-整理算法)
-
适用场景:与Parallel Scavenge搭配或作为CMS后备
-
参数:
-XX:+UseSerialOldGC
(JDK9已移除)
5. Parallel Old 收集器
-
特点:Parallel Scavenge 的老年代版本
-
区域:老年代(标记-整理算法)
-
适用场景:与Parallel Scavenge组合,吞吐量优先
-
参数:
-XX:+UseParallelOldGC
总结:JDK8默认组合(Parallel Scavenge + Parallel Old)。
6. CMS(Concurrent Mark-Sweep)
-
特点:并发标记清除、低延迟
-
区域:老年代(标记-清除算法)
-
流程:
-
初始标记(STW)
-
并发标记
-
重新标记(STW)
-
并发清除
-
-
缺点:内存碎片、并发模式失败(Concurrent Mode Failure)
-
参数:
-XX:+UseConcMarkSweepGC
(JDK14已移除)
总结:减少停顿时间,但内存碎片和CPU敏感。
7. G1(Garbage-First)
-
特点:分区域(Region)收集、可预测停顿模型
-
区域:全堆(标记-整理算法)
-
流程:
-
初始标记(STW)
-
并发标记
-
最终标记(STW)
-
筛选回收(STW)
-
-
优势:平衡吞吐和延迟,适合大堆(JDK9+默认)
-
参数:
-XX:+UseG1GC
总结:现代JVM首选,适合6GB以上堆内存。
8. ZGC(低延迟)
-
特点:并发回收、停顿时间<10ms
-
区域:全堆(染色指针+读屏障)
-
适用场景:超大堆(TB级)、对延迟敏感
-
参数:
-XX:+UseZGC
(JDK15+生产可用)
总结:未来趋势,但需要较新JDK版本。
9. Shenandoah
-
特点:类似ZGC,但开源实现
-
优势:低停顿(与ZGC竞争)
-
参数:
-XX:+UseShenandoahGC
对比总结
收集器 | 目标 | 算法 | 适用场景 |
---|---|---|---|
Serial/Serial Old | 简单 | 复制/标记-整理 | 单核、客户端 |
Parallel Scavenge | 高吞吐 | 复制/标记-整理 | 后台计算 |
CMS | 低延迟 | 标记-清除 | 老年代(JDK8及之前) |
G1 | 平衡 | 标记-整理 | JDK9+默认,大堆 |
ZGC/Shenandoah | 超低延迟 | 染色指针 | 超大堆、敏感应用 |