深入理解Java虚拟机——CMS收集器

Posted 小志的博客

tags:

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

目录

一、CMS收集器的概述

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

二、CMS收集器运行过程

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

  • 并发标记(CMS concurrent mark)
    并发标记阶段就是进行GC Roots Tracing的过程。

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

  • 并发清除(CMS concurrent sweep)

三、CMS收集器优点

  • 并发收集。
  • 低停顿。

四、CMS收集器缺点

  • CMS收集器对CPU资源非常敏感,即占用大量的CPU资源。
  • CMS收集器无法处理浮动垃圾,可能出现"Concurrent Mode Failure"失败导致另一次Full GC的产生。
    由于CMS并发清理阶段用户线程还在运行着,伴随着运行自然就还会有新的垃圾不断产生,这一部分垃圾出现在标记过程后,CMS无法在当次收集中处理掉它们,只好留待下一次GC时再清理掉,这一部分垃圾就称为“浮动垃圾”(Floating Garbage)。
  • 由于CMS收集器基于“标记-清除”算法实现的,收集结束后会有大量空间碎片产生。

五、CMS收集器运行示意图

以上是关于深入理解Java虚拟机——CMS收集器的主要内容,如果未能解决你的问题,请参考以下文章

《深入理解JAVA虚拟机》垃圾回收时为什么会停顿

深入理解Java虚拟机——ParNew收集器

深入理解java虚拟机GC垃圾回收-经典垃圾收集器

《深入理解Java虚拟机系列三》--- 7+2种垃圾收集器(通俗易懂)

深入浅出CMS垃圾收集器

《深入理解JAVA虚拟机》----------第三章 垃圾收集器与内存分配策略,读后感(中)