关于 CMS收集器

Posted 流楚丶格念

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于 CMS收集器相关的知识,希望对你有一定的参考价值。

文章目录

CMS收集器

概念

CMS收集器全称Concurrent Mark Sweep收集器

CMS(Concurrent Mark Sweep)收集器是一种获取最短回收停顿时间为目标的收集器,目前很大一部分的Java应用集中在互联网站或者B/S系统的服务端上,这类应用尤其重视服务的响应速度,希望系统停顿时间最短,以给用户带来较好的体验,CMS收集器就非常符合这类应用的需求。

CMS(Concurrent Mark Sweep)收集器是基于“标记-清除”算法实现的。

PS:上面是官话,听不懂吧,那来说明一下:

  • 首先我们要知道收集器是用来进行垃圾回收的

  • 如果说垃圾收集算法是内存回收的方法论,那垃圾收集器就是内存回收的实践者,也就是说垃圾收集器是实现那些垃圾回收算法的实际程序。

  • CMS知识这些实现的一种而已。

其他的垃圾回收器的介绍可以参考这佬的博文,俺不记了:
https://blog.csdn.net/qq_35165000/article/details/106732837

运行过程

  • 初始标记(CMS initial mark):初始标记仅仅只是标记一下GC Roots 能直接关联到的对象,速度很快。

  • 并发标记(CMS concurrent mark):并发标记阶段就是进行GC Roots Tracing的过程。从GC Roots的直接关联对象开始遍历整个对象图的过程,过程较长,单不需要停顿用户线程;

  • 重新标记(CMS remark):重新标记则是为了修正并发标记期间因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍长一些,但远比并发标记的时间短。

  • 并发清除(CMS concurrent sweep):来清除死亡的对象。

优缺点

优点

  • 可以实现并发收集。
  • 垃圾回收时低停顿。

缺点

  • CMS收集器对CPU资源非常敏感,即占用大量的CPU资源

  • CMS收集器无法处理浮动垃圾,可能出现"Concurrent Mode Failure"失败导致另一次Full GC的产生。

    浮动垃圾是指在并发标记和并发清理阶段产生的新的垃圾对象,这部分对象如果逃脱了标记过程,就不能在当次垃圾手机过程中被回收,只好留待下一次GC时再清理掉。

  • 由于CMS收集器基于“标记-清除”算法实现的,收集结束后会有大量空间碎片产生

CMS收集器运行示意图

以上是关于关于 CMS收集器的主要内容,如果未能解决你的问题,请参考以下文章

CMS收集器和G1收集器的区别

CMS收集器和G1收集器的区别

垃圾回收期-G1和CMS

CMS 和G1 的区别

CMS 和 G1 收集器比较

G1和CMS垃圾收集器