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收集器,并进行相应的调优。

相关文章
|
5月前
|
算法 安全 Java
(七)JVM成神路之GC分代篇:分代GC器、CMS收集器及YoungGC、FullGC日志剖析
在《GC基础篇》中曾谈到过分代以及分区回收的概念,但基础篇更多的是建立在GC的一些算法理论上进行高谈阔论,而本篇则重点会对于分代收集器的实现进行全面详解,其中会涵盖串行收集器、并行收集器、三色标记、SATB算法、GC执行过程、并发标记、CMS收集器等知识,本篇则偏重于分析GC机制的落地实现,也就是垃圾收集器(Garbage Collector)。
117 8
|
4月前
|
算法 Oracle 安全
Concurrent Mark Sweep Collector(CMS垃圾收集器官网规范翻译)
CMS垃圾收集器旨在减少应用程序在垃圾收集过程中的暂停时间,通过利用多处理器的优势,在并发标记和并发清除阶段允许应用程序继续运行。这对于响应时间敏感的应用程序尤其有用,因为它可以显著降低GC暂停带来的影响。
|
算法 Java 微服务
20-Serial收集器+ParNew收集器
如果说收集算法是内存回收的方法论, 那垃圾收集器就是内存回收的实践者。 《Java虚拟机规范》 中对垃圾收集器应该如何实现并没有做出任何规定, 因此不同的厂商、 不同版本的虚拟机所包含的垃圾收集器都可能会有很大差别, 不同的虚拟机一般也都会提供各种参数供用户根据自己的应用特点和要求组合出各个内存分代所使用的收集器。
63 0
|
算法 NoSQL Java
深入理解JVM - CMS收集器
上一篇文章我们讲解分代的基础理论,同时讲解了新生代和老年代各自的算法复制算法和标记整理算法,之后我们总结了新生代进入老年代的条件,在最后我们介绍的引用类型,同时进行了练习的提问和相关的解答。
95 0
|
Java
JVM-08垃圾收集Garbage Collection【GC常用参数】
JVM-08垃圾收集Garbage Collection【GC常用参数】
64 0
|
算法 Java
JVM-06垃圾收集Garbage Collection(下)【垃圾收集器】
JVM-06垃圾收集Garbage Collection(下)【垃圾收集器】
80 0
|
监控 数据可视化 Java
JVM-07垃圾收集Garbage Collection【GC日志分析】
JVM-07垃圾收集Garbage Collection【GC日志分析】
157 0
|
算法 Java
JVM--JVM经典垃圾收集器整理(Serial收集器、ParNew收集器、Parallel Scavenge收集器、Garbage First收集器、Z
- 1、Serial收集器 - 2、ParNew收集器 - 3、Parallel Scavenge收集器 - 4、Serial Old收集器 - 5、Parallel Old收集器
386 0
JVM--JVM经典垃圾收集器整理(Serial收集器、ParNew收集器、Parallel Scavenge收集器、Garbage First收集器、Z
|
算法 Java
浅析经典JVM垃圾收集器-Serial/ParNew/Parallel Scavenge/Serial Old/Parallel Old/CMS/G1(下)
在讲述垃圾收集器之前,我们得先知道JVM中常见的垃圾收集算法有什么,具体请参考我的这篇博文。如果说收集算法是内存回收的方法论, 那垃圾收集器就是内存回收的实践者。下面就来详细概述下Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1这七款垃圾收集器的特点及使用场景。