Java虚拟机中的垃圾回收机制
Java虚拟机(JVM)是Java程序运行的核心环境,而垃圾回收(Garbage Collection, GC)机制则是JVM自动管理内存的关键技术,在众多垃圾回收算法中,并发标记清除(Concurrent Mark-Sweep, CMS)算法因其低停顿时间的特性,曾广泛应用于对响应时间敏感的生产环境,本文将深入探讨CMS垃圾回收器的工作原理、优缺点及适用场景,帮助开发者更好地理解和使用这一技术。

CMS垃圾回收器概述
CMS是JVM中一款以获取最短回收停顿时间为目标的垃圾回收器,它主要针对老年代(Old Generation)进行垃圾回收,与传统的标记-清除算法不同,CMS在执行过程中尽可能让垃圾回收线程与用户线程并发执行,从而减少STW(Stop-The-World)的时间,CMS是基于“标记-清除”(Mark-Sweep)算法实现的,其核心思想是先标记出存活对象,再清除未被标记的垃圾对象。
CMS的工作流程
CMS垃圾回收器的执行过程分为四个主要阶段,其中三个阶段可以与用户线程并发执行,仅有一个需要暂停用户线程。
-
初始标记(Initial Mark)
该阶段是STW阶段,仅标记GC Roots直接关联的对象,速度较快,方法区中类静态变量引用的对象、虚拟机栈中引用的对象等,此阶段的目标是建立一个初始的存活对象标记集合,为后续并发标记做准备。 -
并发标记(Concurrent Mark)
该阶段与用户线程并发执行,遍历初始标记阶段标记的对象,通过可达性分析算法递归标记所有存活对象,由于并发执行,用户线程的运行可能会产生新的垃圾或改变对象引用关系,因此需要后续的重新标记阶段进行修正。 -
重新标记(Remark)
这是第二个STW阶段,用于并发标记阶段因用户线程运行导致变动的对象进行修正,新分配的对象、引用发生变化的旧对象等,重新标记阶段的时间长短取决于并发标记期间用户线程产生的垃圾量,通常比初始标记阶段稍长。
-
并发清除(Concurrent Sweep)
该阶段与用户线程并发执行,清除未被标记的垃圾对象,释放内存空间,由于是并发执行,可能会出现“浮动垃圾”(Floating Garbage),即在并发清除阶段新产生的垃圾,这些垃圾将在下一次GC中被清理。
CMS的优点与缺点
优点
- 低停顿时间:CMS通过并发执行大幅减少了STW时间,特别适合对响应时间要求较高的应用场景,如Web服务、实时交易系统等。
- 高吞吐量:在并发阶段,用户线程可以继续运行,系统整体吞吐量较高。
缺点
- 内存碎片化:CMS基于“标记-清除”算法,清除后会产生大量内存碎片,可能导致大对象无法分配空间,从而触发Full GC。
- 并发资源占用:并发执行需要占用CPU资源,可能在CPU资源紧张时影响应用性能。
- 处理浮动垃圾能力有限:并发清除阶段产生的浮动垃圾可能导致内存提前耗尽,触发Concurrent Mode Failure,进而退化为Serial Old GC,导致停顿时间显著增加。
CMS的适用场景与调优建议
适用场景
CMS适用于对停顿时间敏感、老年代对象存活时间较长的应用场景,互联网服务、在线交易系统等,这些场景需要尽可能短的GC停顿时间以保证用户体验。
调优建议

- 调整堆大小:合理设置堆大小和Eden、Survivor、Old Generation的比例,减少Full GC的触发频率。
- 开启-XX:+UseCMSCompactAtFullGC:在Full GC时进行内存整理,减少碎片化问题。
- 设置-XX:CMSInitiatingOccupancyFraction:控制老年代空间使用率达到多少时触发CMS,避免浮动垃圾过多导致Concurrent Mode Failure。
- 监控GC日志:通过GC日志分析CMS的执行情况,优化触发时机和参数配置。
CMS的替代方案与未来趋势
随着Java版本的更新,CMS垃圾回收器逐渐被G1(Garbage-First)和ZGC(Z Garbage Collector)等新一代垃圾回收器取代,G1通过分区(Region)的堆内存布局和可预测的停顿时间模型,解决了CMS的内存碎片问题;而ZGC则实现了亚毫秒级的停顿时间,适用于超大内存堆的场景,尽管如此,CMS在Java 8及更早版本中仍具有重要地位,许多生产环境的应用仍在使用CMS。
CMS垃圾回收器作为JVM中一款经典的并发垃圾回收器,通过并发执行大幅降低了STW时间,适用于对响应时间敏感的应用场景,其内存碎片化、并发资源占用等问题也不容忽视,开发者在使用CMS时,需结合业务场景合理调优参数,并关注新一代垃圾回收器的发展趋势,以更好地平衡性能与资源消耗,随着Java技术的不断演进,理解CMS的工作原理和优缺点,将有助于开发者更深入地掌握JVM内存管理机制,优化系统性能。



















