JVM - 什么是CMS(Concurrent Mark-Sweep)垃圾回收器?

总结

-XX:+UseConcMarkSweepGC ,表示新生代使用ParNew,老年代的用CMS

 

CMS 是英文 Concurrent Mark-Sweep 的简称,是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。在启动 JVM 的参数加上“-XX:+UseConcMarkSweepGC”来指定使用 CMS 垃圾回收器。

CMS 使用的是标记-清除的算法实现的,所以在 gc 的时候回产生大量的内存碎片,当剩余内存不能满足程序运行要求时,系统将会出现 Concurrent Mode Failure,临时 CMS 会采用 Serial Old 回收器进行垃圾清除,此时的性能将会被降低。

 

详细信息

 

 

收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的Java应用集中在互联网站或者B/S系统的服务端上,这类应用尤其重视服务的响应速度,希望系统停顿时间最短,以给用户带来较好的体验。CMS收集器就非常符合这类应用的需求。只有CMS在清除时,和用户线程并行
从名字(包含“Mark Sweep”)上就可以看出,CMS收集器是基于“标记—清除”算法实现的,它的运作过程相对于前面几种收集器来说更复杂一些,整个过程分为4个步骤,包括:

  • 初始标记-短暂(用户的应用线程需要暂停),仅仅只是标记一下GC Roots能直接关联到的对象,速度很快。
  • 并发标记-和用户的应用程序同时进行,进行GC RootsTracing的过程
  • 重新标记-短暂(用户的应用线程需要暂停),为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍长一些,但远比并发标记的时间短。
  • 并发清除-可能产生浮动垃圾

由于整个过程中耗时最长的并发标记和并发清除过程收集器线程都可以与用户线程一起工作,所以,从总体上来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。
-XX:+UseConcMarkSweepGC ,表示新生代使用ParNew,老年代的用CMS

缺点:

  • 浮动垃圾
  • 用户的线程还在运行,需要给用户线程留下运行的内存空间。
  • 参数: -XX:CMSInitialOccupyFraction 当老 年代空间使用超过这个值的时候启动收集68%。 后来调整到92%。
  • 出现-一个错误: "Concurrent Mode Failure,”,启动SerialOld收集器。。
  • -XX:+UseCMSCompactAtFulCollection (默认开启) 需要进行FullGC 的时候开启内存碎片的整理,无法并发
  • -XX:CMSFullGCsBeforeCompaction (默认为0),设置多少次不压缩的FullIGC 后来一次压缩的。

 

posted on 2020-12-18 00:06  frank_cui  阅读(871)  评论(0编辑  收藏  举报

导航

levels of contents