CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。它非常符合在注重用户体验
的应用上使用,它是HotSpot虚拟机第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程(基
本上)同时工作。
从名字中的
Mark Sweep
这两个词可以看出,CMS收集器是一种
“标记-清除”算法
实现的,它的运作过程相比于前面
几种垃圾收集器来说更加复杂一些。整个过程分为四个步骤:
初始标记:
暂停所有的其他线程(STW),并记录下gc roots
直接能引用的对象
,
速度很快
。
并发标记:
并发标记阶段就是从GC Roots的直接关联对象开始遍历整个对象图的过程, 这个过程耗时较长但
是不需要停顿用户线程, 可以与垃圾收集线程一起并发运行。因为用户程序继续运行,可能会有导致已经标记过的
对象状态发生改变。
重新标记:
重新标记阶段就是为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对
象的标记记录(
主要是处理漏标问题
),这个阶段的停顿时间一般会比初始标记阶段的时间稍长,远远比并发标记阶
段时间短。
主要用到三色标记里的
增量更新算法(见下面详解)做重新标记。
并发清理:
开启用户线程,同时GC线程开始对未标记的区域做清扫。这个阶段如果有新增对象会被标记为黑
色不做任何处理(见下面三色标记算法详解)。
并发重置:
重置本次GC过程中的标记数据
从它的名字就可以看出它是一款优秀的垃圾收集器,主要优点:
并发收集、低停顿
。但是它有下面几个明显的缺点:
对CPU资源敏感(会和服务抢资源);
无法处理
浮动垃圾
(在并发标记和并发清理阶段又产生垃圾,这种浮动垃圾只能等到下一次gc再清理了);
它使用的回收算法-
“标记-清除”算法
会导致收集结束时会有
大量空间碎片
产生,当然通过参数-
XX:+UseCMSCompactAtFullCollection可以让jvm在执行完标记清除后再做整理
执行过程中的不确定性,会存在上一次垃圾回收还没执行完,然后垃圾回收又被触发的情况,
特别是在并
发标记和并发清理阶段会出现
,一边回收,系统一边运行,也许没回收完就再次触发full gc,也就是"
concurrent
mode failure
",
此时会进入stop the world,用serial old垃圾收集器来回收
20、CMS比较严重的问题并发收集阶段再次触发Full gc怎么处理
CMS垃圾收集器收集垃圾过程中,会存在上一次垃圾回收还没执行完,然后垃圾回收又被触发的情况,
特别是在并发标
记和并发清理阶段会出现
,一边回收,系统一边运行,也许没回收完就再次触发full gc,也就是"
concurrent mode
failure
",
此时会进入stop the world,用serial old垃圾收集器来回收