CMS是一种以获取最短回收停顿时间为目标的收集器
优点:
1.并发收集
2.低停顿
缺点
1.CMS收集器对CPU资源非常敏感
2.CMS收集器无法处理浮动垃圾
3.基于标记-清除算法,所以易产生空间碎片
CMS执行步骤:
1.初时标记(STW)
2.并发标记
3.重新标记(STW)
4.并发清除
初始标记:标记一下GCRoots能关联到的对象,速度很快。
并发标记:进行GCRoots Tracing的过程。
重新标记:为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的STW一般会比初时标记阶段的时间长,但比并发标记的时间短
由于整个过程中耗时最长的并发标记和并发清除过程收集器线程都可以与用户线程一起工作,所以总体上来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。
CMS收集器对CPU资源非常敏感是指在并发阶段,它虽然不会导致用户线程停顿,但是会因为占用了一部分线程(或者说CPU资源)而导致应用程序变慢,总吞吐量会降低。
CMS收集器无法处理浮动垃圾(Floating Garbage),可能出现“Concurrent Mode Failure”失败而导致另--次FullGC的产生。由于CMS并发清理阶段用户线程还在运行着,伴随程序运行自然就还会有新的垃圾不断产生,这-部分垃圾出现在标记过程之后,CMS无法在当次收集中处理掉它们,只好留待下一次GC时再清理掉。这一部分垃圾就称为“浮动垃圾”。
CMS是基于标记-清除算法,所以会有大量空间碎片产生。空间碎片过多时,将会给大对象分配带来很大麻烦,往往会出现老年代还有很大空间剩余,但是无法找到足够大的连续空间来分配当前对象,不得不提前触发一次Full GC。