当前位置:   article > 正文

JVM 调优实战 - JVM老年代垃圾回收器CMS的内部工作机制

JVM 调优实战 - JVM老年代垃圾回收器CMS的内部工作机制

CMS (Concurrent Mark Sweep) 是一款低停顿时间的垃圾回收器,主要设计用于老年代的垃圾回收。CMS 通过使用并发的方式减少应用程序的暂停时间,使其成为对响应时间敏感的应用程序的理想选择。下面详细介绍CMS垃圾回收器的内部工作机制。

CMS 的工作原理

CMS 主要分为四个阶段:

  1. 初始标记 (Initial Marking)

    • 描述:这是一个短暂的STW (Stop-The-World) 阶段,用于标记出GC Roots直接可达的对象。
    • 特点:非常快速,因为只需要标记GC Roots直接可达的对象。
    • 并发性:此阶段是单线程的,所有应用程序线程都会被暂停。
  2. 并发标记 (Concurrent Marking)

    • 描述:这个阶段是真正执行标记工作的阶段,它与应用程序线程并发执行。
    • 特点:此阶段耗时较长,但由于是并发执行的,因此不会导致应用程序暂停。
    • 并发性:此阶段与应用程序线程并发执行,只有很少的STW时间。
  3. 重新标记 (Remark)

    • 描述:在并发标记阶段结束后,还需要进行一次短暂的STW阶段,以修正并发标记期间被修改的对象。
    • 特点:此阶段同样非常快速,但它需要暂停所有应用程序线程。
    • 并发性:此阶段是单线程的,所有应用程序线程都会被暂停。
  4. 并发清除 (Concurrent Sweep)

    • 描述:在重新标记之后,CMS会并发清除已经标记为不可达的对象。
    • 特点:此阶段也是与应用程序线程并发执行的,不会导致应用程序暂停。
    • 并发性:此阶段与应用程序线程并发执行。

CMS 的特点

  1. 低停顿时间:由于大部分工作是在应用程序线程运行的同时并发进行的,因此总的STW时间较短。
  2. 内存碎片问题:CMS 使用标记-清除算法,这会导致内存碎片问题。当可用内存不足时,CMS可能会执行一次Full GC,使用标记-压缩算法来整理内存。
  3. 内存不足处理:如果CMS在并发清除阶段无法完成工作,因为内存不足,它会触发一次Full GC,这会导致较长的STW时间。
  4. 配置选项
    • 启用CMS:通过 -XX:+UseConcMarkSweepGC 参数启用CMS垃圾回收器。
    • 并发线程数:通过 -XX:ParallelCMSThreads 参数来指定并发标记阶段的工作线程数量。
    • 最小堆压缩:通过 -XX:CMSInitiatingOccupancyFraction 参数来设置触发CMS回收的堆占用百分比。

CMS 的局限性

  1. 内存碎片:由于CMS使用标记-清除算法,因此可能会导致内存碎片,这会影响后续对象的分配。
  2. Full GC:当CMS无法完成垃圾回收时,可能会触发一次Full GC,这会导致较长的STW时间。
  3. 配置复杂:CMS的配置相比其他垃圾回收器较为复杂,需要更多参数来调整其行为。

CMS 的配置示例

为了启用CMS垃圾回收器,你需要在启动Java应用程序时添加以下JVM参数:

-Xms<size> -Xmx<size> -XX:+UseConcMarkSweepGC
  • 1

其中 -Xms-Xmx 分别指定了堆的初始大小和最大大小,-XX:+UseConcMarkSweepGC 表示使用CMS作为老年代的垃圾回收器。

总结

CMS 是一款专门为降低STW时间而设计的老年代垃圾回收器,它通过并发执行大部分工作来减少应用程序暂停的时间。尽管它在某些方面具有局限性,但对于响应时间敏感的应用程序来说,CMS 提供了一个很好的解决方案。

如果你有任何关于CMS的具体问题或者需要更深入的理解,请随时提问。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/926492
推荐阅读
相关标签
  

闽ICP备14008679号