Serial是单线程GC,适合小堆、低资源场景;Parallel追求高吞吐,适用于批处理;G1兼顾延迟与吞吐,适合中大型堆;ZGC和Shenandoah实现亚毫秒级停顿,适用于超低延迟需求。

Serial 收集器:单线程场景下的轻量选择
Serial 是最基础的垃圾回收器,使用单线程进行所有 GC 工作(包括年轻代和老年代),全程暂停应用线程(Stop-The-World)。它适合客户端模式、堆内存较小(如几十 MB)、对吞吐量要求不高且 CPU 资源受限的场景,比如嵌入式设备或开发测试环境。
启用方式:-XX:+UseSerialGC。开启后,年轻代用 Serial,老年代自动使用 Serial Old。
优势在于低内存占用和简单稳定;缺点是 STW 时间随堆增大明显增长,不适合服务端应用。
Parallel(吞吐量优先)收集器:追求高吞吐的默认之选
Parallel Scavenge(年轻代) + Parallel Old(老年代)组合,以“吞吐量最大化”为目标设计,采用多线程并行回收,适用于后台计算型、批处理类应用。
立即学习“Java免费学习笔记(深入)”;
关键参数包括:-XX:MaxGCPauseMillis(设置 GC 最大停顿目标,但不保证)、-XX:GCTimeRatio(设定吞吐量目标,如 19 表示 GC 时间不超过总运行时间的 1/20)。
JDK 8 及以前,Server 模式默认使用 Parallel;JDK 9+ 默认改为 G1,但若明确需要吞吐优先,仍可主动启用:-XX:+UseParallelGC。
G1 收集器:兼顾延迟与吞吐的通用主力
G1(Garbage-First)将堆划分为多个大小相等的 Region,优先回收垃圾最多的区域(“Garbage-First”),支持可预测的停顿时间模型。它既不是纯粹的分代收集器,也不完全抛弃分代概念,而是通过 Remembered Set 维护跨 Region 引用。
适用中大型堆(4GB~数十 GB)、对响应时间有一定要求(如 Web API 服务),同时希望避免 Full GC 频繁发生。
启用:-XX:+UseG1GC;常用调优项:-XX:MaxGCPauseMillis=200(目标停顿时间,默认 200ms)、-XX:G1HeapRegionSize(手动指定 Region 大小,通常无需设置)。
注意:G1 在 JDK 10 后成为默认 GC,JDK 17+ 中仍是主流推荐,尤其在延迟敏感又需稳定吞吐的混合负载下表现均衡。
ZGC 和 Shenandoah:超低延迟场景的新选择
ZGC(JDK 11 引入,生产可用始于 JDK 15)和 Shenandoah(JDK 12 实验,JDK 15 正式支持)都主打“亚毫秒级 GC 停顿”,无论堆大小(TB 级别),STW 时间基本控制在 10ms 以内。
它们通过并发标记、并发移动对象、读屏障(ZGC)或写屏障(Shenandoah)实现极低延迟,代价是额外内存开销(ZGC 约 16% 元数据)和一定吞吐损耗(约 10%~15%)。
适用场景:金融交易、实时风控、游戏服务器等对延迟极度敏感,且硬件资源充足(多核、大内存)的服务。
启用方式:
ZGC:-XX:+UseZGC
Shenandoah:-XX:+UseShenandoahGC










