读书笔记-JVM-CMS垃圾回收器

67 阅读2分钟

Concurrent Mark Sweep(CMS) 垃圾回收器是一种以获取最短回收停顿时间为目标的收集器。

初始标记:需要stop the world,标记一下GC Root能直接关联的对象,速度很快。

并发标记:不需要stop th world,时间较长,但可以和用户线程一起运行。

重新标记:需要stop the world,修正并发标记期间,由于用户线程运行导致的标记产生的变动。

并发清除:不需要stop the world,直接删除标记过已经死亡的对象。

怎样做到低停顿的?

在最耗时的两个阶段采用并发的手段,不需要暂停用户线程,在清除对象时采用,标记-清除算法,也可提高清除速度

CMS对处理器的资源比较敏感

并发阶段,虽然不会暂停用户线程,但是会占用部分系统线程,CMS默认启动的回收线程数是(核心数+3)/4,这样的话如果处理器的本身负责比较高,还要分出一部分线程去回收垃圾,从而降低吞吐量。

CMS无法处理浮动垃圾

在并发标记过程中用户线程正常运行,程序会产生新的垃圾,有些垃圾在并发标记之后,这样再清除的时候不会被清除,所以在垃圾收集过程中需要给用户预留足够的空间。因此CMS收集器不能等到老年代快被填满才进行垃圾回收。jdk默认92%,

但是这又会产生另外一个问题,如果预留的内存无法满足程序分配新对象,就会出现Concurrent Mode Failure,这样就会再次暂停用户线程,启动Serial Old收集器来重新进行老年代的手机,这样停顿时间就更长了。

标记-清除算法会产生内存碎片

内存碎片会对大对象分配产生麻烦,可能会遇到有空间但是无法分配的情况,而不得不触发Full GC

CMS一些参数

-XX:CMSInitiatingOccu-pancyFraction 用来提高CMS的触发百分比

-XX:+UseCMSCompactAtFullCollection 用于在CMS不得不进行Full GC时开启内存碎片整理过程

-XX:CMSFullGCsBeforeCompaction 用于指定多少次不整理空间收集后下一次进行碎片整理