CMS垃圾收集器
以获取最短回收停顿为目标,基于标记清除算法
运作过程
初始标记(STW)
-
GC Roots能直接关联到的对象及「年轻代」指向「老年代」的对象
- 速度快:因为没有「向下追溯」(只标记一层)
并发标记
-
从GC Roots向下「追溯」,标记所有可达的对象
-
并发预处理
-
针对老年代的对象:类cardtable
- 扫描可能由于「并发标记」过程中导致老年代发生变化的对象,会再扫描一遍标记为dirty的卡页
-
针对新生代
- 遍历新生代判断在「并发标记」过程中有没有对象引用了老年代
- 在这个过程中可能会触发一次 minor GC
-
重新标记(STW)
- 扫描dirty card和年轻代,标记存活老年对象
并发清除
- 回收不可达对象
- 由于处于并发状态,用户线程在不断产生垃圾,但只能留到下次GC ,这些垃圾叫“浮动垃圾”
重置 CMS 算法相关的内部数据,为下一次 GC 循环做准备
缺点 不足(有相应参数设置)
需要预留空间
-
并发状态要保证有充足的内存空间供用户使用
-
预留空间不够用,报错(Concurrent Mode Failure)
- 启动 Serial Old进行老年代的垃圾回收导致停顿的时间很长
内存碎片
-
基于「标记清除算法」的收集器会产生内存碎片
- 碎片太多,可能会导致内存空间不足触发full GC
- 一般会在触发full GC这个过程对碎片进行整理