GC 对比矩阵(G1/ZGC/Shenandoah)
JVM 提供了多种 GC 选择,每种都有其特点和适用场景。理解它们的差异,是做出正确选型决策的基础。
本文将对主流 GC 进行全面对比,帮助你在不同场景下做出最佳选择。
收集器全景对比
停顿时间对比
吞吐量对比
选型建议
场景一:小内存、低要求
适用配置:
适用场景:
- 堆内存
<1GB - 单核 CPU
- 客户端应用
- 低延迟要求不高
场景二:批处理、吞吐量优先
适用配置:
适用场景:
- 后台批处理任务
- ETL 作业
- 科学计算
- 日志处理
场景三:中等内存、平衡需求
适用配置:
适用场景:
- 堆内存
4GB~16GB - 需要平衡停顿时间和吞吐量
- Web 服务、API 服务
- Java 9+ 默认选择
场景四:超大内存、极低延迟
适用配置:
适用场景:
- 堆内存
>16GB - 极致低延迟要求(金融、游戏)
- 高可用服务
- 不能接受长停顿的关键系统
决策树
迁移指南
从 CMS 迁移
CMS 在 Java 14 中已被移除,迁移选项:
- 迁移到 G1(推荐)
- 迁移到 ZGC
从 Serial/Parallel 迁移
如果应用需要更低的延迟:
从 G1 迁移到 ZGC
如果堆内存超过 16GB 且需要更低的延迟:
未来展望
GC 技术仍在持续演进:
- Generational ZGC:ZGC 的分代版本,进一步提升性能
- Leyden:OpenJDK 的静态编译项目,旨在缩短启动时间
- 虚拟线程:Loom 项目的一部分,可能改变内存分配模式
持续关注这些发展,可以帮助你在未来做出更好的技术决策。