CMS收集器
特点:
1.以获取最短回收停顿时间为目标
2.CMS全称是 Concurrent Mark Sweep。从名字就可以看出来两个特点,一是并发,这里并发并不是指多条GC进程一起工作,而是指GC进程可以与用户进程一起工作。二是,该垃圾收集器使用标记清除算法的方式回收垃圾。
收集过程:
1.初始标记:这个过程需要Stop the world,初始化标记仅仅只是标记一下GC Roots能直接关联到的对象。时间短。
2.并发标记:就是进行GC Roots Tracing的过程。这个过程中,用户进程与GC进程一起工作,所以对象引用关系在这个过程后可能会发生变化。时间长。
3.重新标记:这个过程需要Stop the World,修正并发标记期间因用户程序继续运行导致标记产生变动的那一部分对象的标记记录。时间比初始标记阶段长,比并发标记阶段短。
4.并发清除:这个过程中,用户进程与GC进程一起工作,GC清理垃圾。
总体上来看:时间最长的两个过程并发标记与并发清除过程中GC进程与用户进程并发,所以认为CMS是一款并发的垃圾收集器。
缺点:
1.CMS对CPU资源敏感,因为GC进程和用户进程一起跑的,所以用户进程不会停顿,但总吞吐量会变低。如果CPU数量多还好,如果CPU很少的话,用户程序的执行速度很变慢。
2.CMS无法处理浮动垃圾,因为并发清除这个阶段没有Stop the world。这个阶段中可能会有新的垃圾产生,但是这些垃圾没有被标记不会被清理。只能等待下次GC的时候再清理了。也是由于在垃圾收集阶段用户线程还需要运行,那也就还需要预留足够的内存空间给用户线程使用。CMS不能像其他收集器等到老年代几乎完全填满了再进行收集,需要预留一部分空间提供给并发收集时的运作使用。如果运行间预留的内存不够,那CMS就失败了,虚拟机将启动后备预案:启用Serial Old收集器来进行老年代的垃圾收集。
3.因为CMS是基于标记清除算法的,所以会有很多空间碎片。所以会给大对象的分配带来很大问题,哪怕老年代有很大空间剩余,但是连续空余的空间很小也要FULL GC。CMS提供了UseCMSCompactAtFullCollection参数来在合适的时候合并整理内存碎片。但是内存整理的过程是无法并发的,停顿时间会变长。