1. CMS GC 在 JDK 14 被完全移除后遗留项目的迁移路径与 G1/ZGC 的替代方案
CMS GC 在 JDK 14 中被完全移除,遗留项目该如何规划迁移路径,G1 与 ZGC 作为替代方案应如何选择?
- CMS 移除的时间线与历史背景
- G1 与 ZGC 的停顿模型与适用场景差异
- 迁移路径的验证方法与参数迁移
CMS 自 JDK 9 起被标记为废弃,并在 JDK 14 被正式移除(JEP 363)。遗留项目迁移的第一步是明确目标收集器:若业务对吞吐敏感、堆规模适中且能容忍一定停顿,首选 G1(其目标就是替代 CMS 成为默认收集器);若业务对低延迟有硬性要求(如亚秒级停顿),则考虑 ZGC(JDK 15 GA,JDK 21 引入分代模式)。迁移路径上应先做参数对齐:把 -XX:UseConcMarkSweepGC、-XX:CMSParallelRemarkEnabled、-XX:CMSInitiatingOccupancyFraction 等 CMS 专属参数移除,改用 G1 的 -XX:MaxGCPauseMillis、-XX:InitiatingHeapOccupancyPercent 或 ZGC 的 -XX:SoftMaxHeapSize 等。随后用灰度流量做压测,对比 GC 日志、暂停时间、吞吐与内存占用,确认无回归后再全量切换。
迁移的核心是"停顿模型"的匹配:CMS 用并发标记清除降低停顿,但存在碎片与浮动垃圾;G1 用 Region 化 + 并发标记 + 可预测停顿,ZGC 用染色指针 + 并发整理实现亚毫秒停顿。选择替代方案不能只看"低延迟",还要评估堆规模、CPU 开销(ZGC 的读屏障有额外开销)和吞吐目标。
// JDK 8 遗留参数(CMS)
// -XX:+UseConcMarkSweepGC -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70
// 迁移到 G1(JDK 11+ 默认)
// -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=45
// 迁移到 ZGC(JDK 21+)
// -XX:+UseZGC -Xms16g -Xmx16g -XX:SoftMaxHeapSize=14g