首页 > 代码库 > JVM之CMS收集器

JVM之CMS收集器

CMS(Concurrent Mark Sweep) 最短回收停顿,适合维持响应时间上的要求。

  • 初始标记 Initial mark:标记GC Roots能够关联到的对象。stop-mark。
  • 并发标记 Concurrent mark:GC Roots tracing,并行业务线程。
  • 重新标记 remark:重新标记并发标记过程中因为用户程序同时运行而导致标记产生变动的对象的标记记录。stop-mark。
  • 并发清除 Concurrent sweep:清除无用对象。

初始标记和重新标记占用时间比较短。

技术分享

缺点:

  • 并发阶段占用cpu资源,拖慢用户程序,降低吞吐量,CMS默认启用(CPU + 3)/4个线程执行。
  • 无法处理浮动垃圾(Floating Gorbage),并发清理阶段用户程序产生的垃圾,成为浮动垃圾,无法被当次处理。为了预留用户程序运行使用内存,CMS需在老年代一定比例时就进行收集,通过-XX:CMSInitiatingOccupancyFraction设置老年代出发CMS比例。
  • 基于标记清除算法的CMS,会使老年代产生很多空间碎片,不利于大对象的使用,使用-UseCMSCompactAtFullCollection(默认true)来设置在将要进行CMS收集时进行碎片整理压缩,此设置会造成停顿,同时可以设置-XX:CMSFullGCsBeforeCompaction来设置执行碎片整理的间隔CMS次数,即,执行多少次CMS收集后,执行一次碎片整理。

JVM之CMS收集器