启用CMS需用-XX:+UseConcMarkSweepGC(JDK 8及更早有效),自动搭配ParNew,配合-XX:CMSInitiatingOccupancyFraction和-XX:+UseCMSInitiatingOccupancyOnly控制触发时机,并通过GC日志验证。

要在 Java 中启用 CMS 垃圾回收器,核心是通过 JVM 启动参数显式指定,并配合合理的老年代行为调优。CMS 仅作用于老年代,必须与年轻代收集器(如 ParNew)协同工作,不能单独使用。
启用 CMS 的基本参数
最简方式是添加以下 JVM 参数:
- -XX:+UseConcMarkSweepGC:启用 CMS 收集器(老年代),同时自动选择 ParNew 作为年轻代收集器;
- 该参数在 JDK 7/8 中有效,在 JDK 9 开始被标记为废弃,JDK 14 起彻底移除——所以仅适用于较旧的生产环境(如运行在 JDK 8u292 或更早版本的系统)。
CMS 必须配合的关键调优参数
CMS 不会等到老年代满才启动回收,否则极易触发“Concurrent Mode Failure”,导致退化为 Serial Old 的 Full GC(停顿时间大幅上升)。因此需主动控制触发时机:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- -XX:CMSInitiatingOccupancyFraction=N:设定老年代使用率达到 N% 时启动 CMS 回收(例如 -XX:CMSInitiatingOccupancyFraction=70 表示 70% 占用即开始并发标记);
- -XX:+UseCMSInitiatingOccupancyOnly:确保只按上述百分比触发,不启用 JVM 自适应策略;
- 默认值在 JDK 6+ 是 92%,但实际中常设为 70–85,需结合应用对象晋升速率和并发标记耗时实测调整。
常见配套设置与注意事项
CMS 对运行环境有明确依赖,忽略这些容易适得其反:
立即学习“Java免费学习笔记(深入)”;
- 需搭配 -XX:+UseParNewGC(虽然 -XX:+UseConcMarkSweepGC 默认启用它,但显式声明更清晰);
- 避免与 G1、ZGC、Shenandoah 等现代收集器混用——参数冲突会导致 JVM 启动失败;
- CMS 不整理内存,长期运行易产生碎片,可加 -XX:+UseCMSCompactAtFullCollection(Full GC 时压缩)和 -XX:CMSFullGCsBeforeCompaction=N 控制压缩频率;
- 若观察到频繁 Concurrent Mode Failure,说明 CMS 回收跟不上对象晋升速度,应考虑增大老年代、调低触发阈值,或直接迁移到 G1。
验证是否生效
启动时添加日志参数确认 CMS 已激活:
- -XX:+PrintGCDetails -XX:+PrintGCTimeStamps:查看 GC 日志中是否出现 “CMS-initial-mark”、“CMS-concurrent-mark”、“CMS-concurrent-sweep” 等阶段标识;
- 典型日志片段:[GC (CMS Initial Mark) [1 CMS-initial-mark: 123456K(2097152K)] 表明 CMS 已正常介入。

















