CMS收集器

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top

全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。 https://store.amazingmemo.com/chapterDetail/1685324709017001`

CMS收集器(Concurrent Mark Sweep)

CMS收集器是Java虚拟机(JVM)中的一种垃圾回收器,它主要用于减少垃圾回收时的停顿时间,提高系统的响应速度。CMS收集器适用于注重服务的响应速度或者处理器资源较多的场景。下面我们将详细介绍CMS收集器的工作原理和特点。

工作原理

CMS收集器的工作过程主要分为以下几个阶段:

  1. 初始标记(Initial Mark) 这个阶段是一个STW(Stop-The-World)阶段,即所有的应用线程都会被暂停,以便标记出所有与GC Roots直接关联的对象。这个阶段的耗时通常比较短。

  2. 并发标记(Concurrent Mark) 在这个阶段,CMS收集器并发地遍历对象图,标记出所有存活的对象。这个阶段是并发执行的,不需要暂停应用线程。

  3. 预清理(Preclean) 这个阶段也是并发执行的,它主要是为了减少最终标记阶段的工作量。预清理阶段会处理一些在并发标记阶段因为程序运行而产生变动的对象引用。

  4. 最终标记(Final Mark) 这是第二个STW阶段,它主要是为了处理并发标记和预清理阶段遗留的一些工作。

  5. 并发清除(Concurrent Sweep) 在这个阶段,CMS收集器并发地清除不再使用的对象,并回收它们占用的内存空间。

  6. 并发重置(Concurrent Reset) 这个阶段是为了重置CMS收集器的内部数据结构,为下一次垃圾回收做准备。

特点

  • 并发收集 大部分工作与应用线程一起并发执行,减少了垃圾回收时的停顿时间。

  • 低停顿 由于并发执行,CMS收集器能够实现更低的停顿时间,适合对响应时间有严格要求的应用。

  • 适用于老年代 CMS收集器主要用于收集老年代的垃圾,它是基于“标记-清除”算法实现的。

  • 碎片化问题 由于CMS是基于“标记-清除”算法,因此在清除完对象后会产生空间碎片。空间碎片过多可能会导致大对象无法找到足够的连续空间而提前触发Full GC。

  • CPU资源敏感 由于并发执行,CMS收集器对CPU资源比较敏感。在多核处理器上表现更好,但如果CPU资源紧张,可能会影响应用程序的性能。

使用场景

CMS收集器适用于以下场景:

  • 对响应时间要求较高的应用,如WEB服务器、在线交易处理等。

  • 系统拥有较多的CPU处理器资源。

JVM参数配置

要启用CMS收集器,可以通过JVM启动参数进行配置:

-XX:+UseConcMarkSweepGC

此外,还可以通过一些额外的参数来调整CMS收集器的行为,例如:

  • -XX:CMSInitiatingOccupancyFraction:设置堆内存使用率的阈值,当老年代的使用率超过这个值时,会触发CMS回收。

  • -XX:+UseCMSInitiatingOccupancyOnly:只在达到阈值时才启动CMS回收,避免频繁回收。

  • -XX:+CMSClassUnloadingEnabled:允许CMS回收类加载器及其相关的类实例。

总结

CMS收集器是一种以获取最短回收停顿时间为目标的收集器,适合需要快速响应的应用。然而,它也存在一些缺点,如可能的空间碎片化问题和对CPU资源的敏感性。在选择垃圾回收器时,应根据应用的实际需求和资源情况进行权衡选择。

最后更新于