CMS 收集器
CMS 收集器
程序员朱永胜有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步, 认准
https://blog.zysicyj.top
全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java 面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。https://store.amazingmemo.com/chapterDetail/1685324709017001`
CMS 收集器(Concurrent Mark Sweep)
CMS 收集器是 Java 虚拟机(JVM)中的一种垃圾回收器,它主要用于减少垃圾回收时的停顿时间,提高系统的响应速度。CMS 收集器适用于注重服务的响应速度或者处理器资源较多的场景。下面我们将详细介绍 CMS 收集器的工作原理和特点。
工作原理
CMS 收集器的工作过程主要分为以下几个阶段:
初始标记(Initial Mark)
这个阶段是一个 STW(Stop-The-World)阶段,即所有的应用线程都会被暂停,以便标记出所有与 GC Roots 直接关联的对象。这个阶段的耗时通常比较短。并发标记(Concurrent Mark)
在这个阶段,CMS 收集器并发地遍历对象图,标记出所有存活的对象。这个阶段是并发执行的,不需要暂停应用线程。预清理(Preclean)
这个阶段也是并发执行的,它主要是为了减少最终标记阶段的工作量。预清理阶段会处理一些在并发标记阶段因为程序运行而产生变动的对象引用。最终标记(Final Mark)
这是第二个 STW 阶段,它主要是为了处理并发标记和预清理阶段遗留的一些工作。并发清除(Concurrent Sweep)
在这个阶段,CMS 收集器并发地清除不再使用的对象,并回收它们占用的内存空间。并发重置(Concurrent Reset)
这个阶段是为了重置 CMS 收集器的内部数据结构,为下一次垃圾回收做准备。
特点
并发收集
大部分工作与应用线程一起并发执行,减少了垃圾回收时的停顿时间。低停顿
由于并发执行,CMS 收集器能够实现更低的停顿时间,适合对响应时间有严格要求的应用。适用于老年代
CMS 收集器主要用于收集老年代的垃圾,它是基于 “ 标记 - 清除 “ 算法实现的。碎片化问题
由于 CMS 是基于 “ 标记 - 清除 “ 算法,因此在清除完对象后会产生空间碎片。空间碎片过多可能会导致大对象无法找到足够的连续空间而提前触发 Full GC。CPU 资源敏感
由于并发执行,CMS 收集器对 CPU 资源比较敏感。在多核处理器上表现更好,但如果 CPU 资源紧张,可能会影响应用程序的性能。
使用场景
CMS 收集器适用于以下场景:
- 对响应时间要求较高的应用,如 WEB 服务器、在线交易处理等。
- 系统拥有较多的 CPU 处理器资源。
JVM 参数配置
要启用 CMS 收集器,可以通过 JVM 启动参数进行配置:
1 | -XX:+UseConcMarkSweepGC |
此外,还可以通过一些额外的参数来调整 CMS 收集器的行为,例如:
-XX:CMSInitiatingOccupancyFraction
:设置堆内存使用率的阈值,当老年代的使用率超过这个值时,会触发 CMS 回收。-XX:+UseCMSInitiatingOccupancyOnly
:只在达到阈值时才启动 CMS 回收,避免频繁回收。-XX:+CMSClassUnloadingEnabled
:允许 CMS 回收类加载器及其相关的类实例。
总结
CMS 收集器是一种以获取最短回收停顿时间为目标的收集器,适合需要快速响应的应用。然而,它也存在一些缺点,如可能的空间碎片化问题和对 CPU 资源的敏感性。在选择垃圾回收器时,应根据应用的实际需求和资源情况进行权衡选择。