CMS回收器
简介
1. HotSpot在JDK1.5时期推出的一款垃圾收集器(用于老年代);
2. 采用 标记-清除算法;
3. 无法与新生代收集器Parallel Scavenge配合工作(JDK1.4推出的),能配合使用的新生代收集器:ParNew 或 Serial;
4. G1收集器出现之前CMS的使用非常广泛(到现在还是有很多系统使用);
5.HotSpot虚拟机第一款真正意义上的并发收集器;
6. JDK9 开始若手动设置开启CMS收集器,用户会收到警告信息:提示CMS未来将会被抛弃;
7. JDK14:删除CMS垃圾回收器,此时若手动设置CMS(XX:+UseConcMarkSweepGC),JVM会给出一个warning,自动回退默认GC启动JVM;
原理
CMS整个过程分为四个阶段:初始标记、并发标记、重新标记、并发清除阶段;
1. 初始标记:会短暂的出现STW(Stop-the-World),标记出GC Roots 能直接关联的对象(比较小),速度非常快;
2.并发标记:从GC Roots 直接关联对象开始遍历整个对象图的过程,耗时比较长,但不需要停顿用户线程,可以与垃圾收集线程一起并发运行;
3. 重新标记:在并发标记阶段中,程序工作线程、垃圾收集线程同时或交叉运行,导致初始标记部分不准确(线程内容发送变动),重新标记阶段用于修正这些变化,也会发生STW且比初始标记时间长一点,但总体还是很快;
4. 并发清除:清除掉标记判断为死亡的对象,释放内存空间,采用标记-清除算法,不会移动内存空间,清除过程中可以和用户线程并发;
特点
并发收集、低延迟
1. 仅仅在初始标记、重新标记阶段会短暂STW而已;
2. 其他阶段基本都是并发执行
弊端
1. 产生内存碎片(标记-清除算法:没去整理清除完的内存空间,但能让用户线程持续运行,不停顿),在无法分配大对象的情况下会提前触发 Full GC;
2. 对CPU资源敏感 (并发阶段占用了一部分线程导致程序变慢,总吞吐量降低)
3. 无法处理浮动垃圾:在并发标记阶段,程序工作线程和垃圾收集线程同时/交叉运行,如果在标记阶段产生新的垃圾,CMS无法对其进行标记,导致这些新产生的垃圾没被及时回收,只能在下次GC时处理;