0%

JVM - 07 java垃圾收集器:选择收集器

选择主要取决于你的应用对 “延迟(Latency)” 与 “吞吐量(Throughput)” 的权衡偏好

1 选择GC收集器

串行收集器:
–适用情况:数据量比较小(100M左右);单处理器下并且对响应时间无要求的应用。
–缺点:只能用于小型应用

并行收集器:
–适用情况:”对吞吐量有高要求”,多CPU、对应用响应时间无要求的中、大型应用。
举例:后台处理、科学计算。
–缺点:垃圾收集过程中应用响应时间可能加长

并发收集器:
–适用情况:”对响应时间有高要求”,多CPU、对应用响应时间有较高要求的中、大型应用。举例:Web服务器/应用服务器、电信交换、集成开发环境。

在 JDK 8 中,推荐根据应用场景选择合适的 GC 算法。对于吞吐量优先的应用,建议使用 Parallel GC(默认选项),它通过多线程进行垃圾回收,以最大化吞吐量。对于响应时间敏感的应用,推荐使用 CMS GC(若需兼容性)或 G1 GC(作为更现代的替代方案),它们旨在减少停顿时间,虽然 G1 GC 在 JDK 9 及之后成为默认选项,但在 JDK 8 中也可手动启用。

根据应用场景选择合适的垃圾回收器
 G1 垃圾回收器 (Garbage First): 适用于大多数应用,是 Java 9 及之后版本的默认回收器。它在吞吐量和延迟之间取得了较好的平衡。
 ZGC: 是一种低延迟、可扩展的垃圾回收器,适合需要极低暂停时间的应用。
 CMS (Concurrent Mark Sweep): 适用于低延迟需求,但容易产生内存碎片。
 Parallel GC (吞吐量优先): 适用于对吞吐量有较高要求的应用。

JDK 18 GC垃圾回收机制比较
Alt text

2 G1和CMS如何选择

G1
最小堆内存 6个G能稳定运行,因此对cpu的要求最少是4核8G
JDK8及更高版本同等环境下只要内存够大(最少8G)优先使用G1

CMS
CMS追求停顿时间越短越好对cpu性能要求比较高同时对内存要求不算高(最少4G)
JDK8及更高版本同等环境下只要cpu性能比较好并且内存不算大 (最少4G)可以使用CMS
JDK7及更低版本同等环境下 可选择CMS (G1不完善)
注意:单核、双核cpu不适合并发类垃圾收集器,线程频繁来回切换也会比较耗时间,还不如串行垃圾收集器效率高。

3.zgc和g1算法如何选择

选择 G1 还是 ZGC 主要取决于你的应用对 “延迟(Latency)” 与 “吞吐量(Throughput)” 的权衡偏好。
核心差异对比

特性 G1 (Garbage First) ZGC (Generational ZGC)
设计目标 在延迟可控的前提下,保持高吞吐量 极低延迟(亚毫秒级停顿)
停顿时间 通常在 10ms - 200ms 之间(可配置) 恒定 < 1ms
内存开销 较低 较高(染色指针和元数据需要更多内存)
吞吐量 更高(适合计算密集型) 略低(并发屏障会消耗约 5%-15% CPU)
适用堆大小 4GB - 64GB+ 8MB - 16TB
成熟度 极其成熟,默认回收器 已成熟,Java 21 后进入生产可用

3.1 什么时候选择 G1?

G1 仍然是 Java 的默认垃圾回收器,适合大多数通用场景:
对停顿不极度敏感:如果你的应用能够接受 100ms 左右的偶尔停顿(例如后台处理系统、非实时批处理)。
CPU 资源有限:G1 的并发开销比 ZGC 小,如果你的服务器 CPU 核心数较少,G1 能提供更高的整体吞吐量。
内存资源受限:如果你的堆内存小于 4GB,G1 的表现通常优于 ZGC。
追求极致稳定性:G1 经历了十多年的大规模生产验证,相关排查工具和经验非常丰富。

3.2 什么时候选择 ZGC?

如果你追求极致的用户体验或处理超大堆,请选择 ZGC:
极度追求低延迟:如高频交易、实时推荐引擎、大型在线游戏服务器或关键路径上的微服务(SLA 要求严格)。
超大堆内存:当堆大小达到 128GB、512GB 甚至数 TB 时,G1 的停顿时间可能会显著增加,而 ZGC 依然能保持亚毫秒级停顿。
现代硬件环境:如果你有充足的 CPU 核心数(ZGC 需要更多后台线程来并发回收内存)。
使用最新 JDK:强烈建议在 JDK 21 或 JDK 25 (LTS) 以后使用 分代 ZGC (Generational ZGC),它解决了旧版 ZGC 容易产生的堆碎片和分配速率限制问题。

3.3 总结

默认选 G1:如果应用运行平稳,没有明显的延迟抖动,不要随意更换。如果对吞吐量有较高要求时,使用Parallel GC算法(JDK1.8默认)。
遇到延迟瓶颈换 ZGC:如果你发现 G1 的 Remark 或 Cleanup 阶段导致服务超时(如常见的 200ms+ 停顿),直接切换到分代 ZGC。
小内存选 Serial:在极小的云原生容器(1核2G以下)中,Serial GC 往往比复杂的 G1 跑得更快。

4 参考资料

Getting Started with the G1 Garbage Collector
Garbage-First (G1) Garbage Collector
G1和CMS处理器如何选择和各自的适用场景
垃圾回收器(下):面向未来的ZGC、Shenandoah

– end –