CMS(Concurrent Mark Sweep)收集器

简介: CMS(Concurrent Mark Sweep)收集器

CMS(Concurrent Mark Sweep)收集器是一种以减少停顿时间(STW,Stop-The-World)为目标的垃圾收集器,主要用于处理老年代的垃圾回收任务,适用于对延迟敏感的应用场景,如Web服务器。以下是CMS收集器的工作原理和特点:

工作原理

CMS收集器的工作流程可以分为以下几个阶段:

  1. 初始标记(Initial Mark):标记从GC Roots直接可达的对象。这个阶段会短暂地暂停所有应用线程,但耗时很短。
  2. 并发标记(Concurrent Mark):在初始标记完成后,CMS开始并发地标记剩余的对象,即从GC Roots开始遍历整个对象图,标记所有可达的对象。这个阶段是与应用程序并行执行的,不会停止应用线程。
  3. 重新标记(Remark):由于在并发标记阶段,应用线程还在继续运行,可能导致一些新的对象变得可达,因此需要重新标记这些新对象。这个阶段也会短暂暂停应用线程,但耗时较短。
  4. 并发清除(Concurrent Sweep):在重新标记后,CMS开始并发地清除未被标记的对象,释放内存空间。这个阶段同样是与应用程序并行执行的,不会停止应用线程。

优点

  • 并发收集:CMS收集器的大部分工作是与应用程序并发执行的,这减少了应用程序的停顿时间,对于需要低延迟的应用来说是一个很大的优势。

缺点

  • 内存碎片:CMS收集器使用标记-清除算法,这会导致内存碎片的产生。随着JVM的长时间运行,碎片化会越来越严重,只有通过Full GC才能完成整理。这可能导致在无法分配大对象的情况下,不得不提前触发Full GC。
  • CPU资源敏感:在并发阶段,CMS虽然不会导致用户停顿,但是会因为占用了一部分线程而导致应用程序变慢,总吞吐量会降低。
  • 无法处理浮动垃圾:在并发标记阶段,如果产生新的垃圾对象,CMS将无法对这些垃圾对象进行标记,最终会导致这些新产生的垃圾对象没有被及时回收,从而只能在下一次执行GC时释放这些之前未被回收的内存空间。

内存碎片处理

CMS收集器的主要问题是碎片化,因为它使用的是Sweep而不是Compact。随着时间的推移,碎片化会越来越严重,只有通过Full GC才能完成整理。CMS提供了CMSScavengeBeforeRemark参数,用来保证Remark前强制进行一次Minor GC,以减少因新生代对象过多而导致的长时间Remark阶段。

综上所述,CMS收集器在减少停顿时间方面表现出色,但同时也带来了内存碎片和CPU资源敏感等问题。在实际应用中,需要根据应用的具体需求和特点来选择是否使用CMS收集器,并进行相应的调优。

相关文章
|
6月前
|
算法 安全 Java
(七)JVM成神路之GC分代篇:分代GC器、CMS收集器及YoungGC、FullGC日志剖析
在《GC基础篇》中曾谈到过分代以及分区回收的概念,但基础篇更多的是建立在GC的一些算法理论上进行高谈阔论,而本篇则重点会对于分代收集器的实现进行全面详解,其中会涵盖串行收集器、并行收集器、三色标记、SATB算法、GC执行过程、并发标记、CMS收集器等知识,本篇则偏重于分析GC机制的落地实现,也就是垃圾收集器(Garbage Collector)。
159 8
|
5月前
|
算法 Oracle 安全
Concurrent Mark Sweep Collector(CMS垃圾收集器官网规范翻译)
CMS垃圾收集器旨在减少应用程序在垃圾收集过程中的暂停时间,通过利用多处理器的优势,在并发标记和并发清除阶段允许应用程序继续运行。这对于响应时间敏感的应用程序尤其有用,因为它可以显著降低GC暂停带来的影响。
|
8月前
|
算法 Java
「译文」Java 垃圾收集参考手册(六):Concurrent Mark and Sweep
「译文」Java 垃圾收集参考手册(六):Concurrent Mark and Sweep
|
Java
JVM-08垃圾收集Garbage Collection【GC常用参数】
JVM-08垃圾收集Garbage Collection【GC常用参数】
74 0
|
算法 NoSQL Java
深入理解JVM - CMS收集器
上一篇文章我们讲解分代的基础理论,同时讲解了新生代和老年代各自的算法复制算法和标记整理算法,之后我们总结了新生代进入老年代的条件,在最后我们介绍的引用类型,同时进行了练习的提问和相关的解答。
100 0
|
监控 数据可视化 Java
JVM-07垃圾收集Garbage Collection【GC日志分析】
JVM-07垃圾收集Garbage Collection【GC日志分析】
166 0
|
算法 Java
【JVM原理探索】彻底弄清楚Minor GC和Major GC及Full GC
【JVM原理探索】彻底弄清楚Minor GC和Major GC及Full GC
667 0
【JVM原理探索】彻底弄清楚Minor GC和Major GC及Full GC
|
算法 Java
JVM--JVM经典垃圾收集器整理(Serial收集器、ParNew收集器、Parallel Scavenge收集器、Garbage First收集器、Z
- 1、Serial收集器 - 2、ParNew收集器 - 3、Parallel Scavenge收集器 - 4、Serial Old收集器 - 5、Parallel Old收集器
394 0
JVM--JVM经典垃圾收集器整理(Serial收集器、ParNew收集器、Parallel Scavenge收集器、Garbage First收集器、Z
|
算法 Java
jvm(9) -- cms收集器、G1收集器
jvm(9) -- cms收集器、G1收集器
146 0
jvm(9) -- cms收集器、G1收集器