要让jvm真正启用并稳定运行cms垃圾收集器,必须成套配置核心参数:-xx:+useconcmarksweepgc、-xx:+useparnewgc、-xx:+usecmsinitiatingoccupancyonly;设置-xx:cmsinitiatingoccupancyfraction=70控制触发阈值;启用-xx:+cmsscavengebeforeremark等优化参数降低stw时间;合理配置-xx:concgcthreads以适配cpu资源。

要让 JVM 真正启用并稳定运行 CMS 垃圾收集器,光加一个 -XX:+UseConcMarkSweepGC 是不够的。核心参数必须成套配置,否则容易出现并发模式失败、频繁 Full GC 或 STW 时间飙升等问题。
必备基础参数
这三项是 CMS 启动的刚性前提,缺一不可:
-
-XX:+UseConcMarkSweepGC:显式启用 CMS 作为老年代收集器(JDK 9+ 已废弃,但 JDK 8 及以前仍需) -
-XX:+UseParNewGC:CMS 要求新生代必须用 ParNew(自动启用,但显式写出更清晰) -
-XX:+UseCMSInitiatingOccupancyOnly:禁用 JVM 自适应触发逻辑,确保阈值严格生效
老年代触发阈值控制
CMS 不像其他收集器那样靠内存压力“自动感知”,它依赖明确的老年代使用率来启动并发周期:
-
-XX:CMSInitiatingOccupancyFraction=70:设为 70 表示老年代使用率达 70% 时触发 CMS。默认值在 JDK 6+ 是 92%,太高易导致并发失败;生产环境建议 60–75 区间,根据对象晋升速率微调 - 该参数必须与
UseCMSInitiatingOccupancyOnly配合,否则 JVM 可能忽略它
关键行为优化参数
这些参数直接影响 CMS 的稳定性与停顿表现:
-
-XX:+CMSScavengeBeforeRemark:在 Remark 阶段前强制一次 Minor GC,大幅减少扫描对象数,降低 Remark STW 时间(通常可缩短 50% 以上) -
-XX:+UseCMSCompactAtFullCollection:每次 Full GC 后执行内存压缩,缓解碎片问题;配合-XX:CMSFullGCsBeforeCompaction=5可控制压缩频次 -
-XX:+CMSParallelRemarkEnabled和-XX:+CMSParallelInitialMarkEnabled:开启多线程标记阶段,显著缩短两次 STW 环节
线程与资源适配
CMS 并发阶段依赖专用 GC 线程,需根据 CPU 资源合理分配:
-
-XX:ConcGCThreads=4:设置并发 GC 线程数。通用公式为min(4, (CPU核数 + 3) / 4);8 核机器常设为 3–4,避免抢占过多 CPU - 若应用本身 CPU 密集,可适当下调,例如设为 2;若 IO 密集且空闲核多,可设为 CPU 核数的一半











