CMSConsurrent Mark Sweep并发标记清除。CMS清理垃圾 主要分为4个节点初始标记-并发标记 -重新标记-清理初始标记和重新标记时都会有STWStop The World出现即当前只有GC线程可以获取CPU执行权限用户线程被挂起。初始标记从GC Roots出发找到能直接关联的对象停顿时间很短但仍需STW并发标记重点部分GC Roots继续遍历对象图此时用户线程也可以继续工作但这样就会衍生出问题初始标记时A anew A()但是在并发阶段anull这样导致GC看到的对象关系图谱已过时这就是为什么需要接下来的Remark重新标记目的就是修改并发标记时用户线程持续修改 对象图谱导致的对象关系图过时的问题Remark仍然会STW重新确定标记有出入就更新最新的对象关系并发清除标记过的对象记为存活其他则是该被清理的对象。CMS的优点1. 停顿时间短它的设计之初就不是为了大吞吐量而是减少用户线程的暂停时间若重视大吞吐量则考虑 Parallel GC2. 大部分GC可以和用户线程并发执行。缺点1. 内存碎片标记存活对象清理未被标记的死亡对象会造成内存不连续即使总的空余内存足够创建新的对象但没有一块连续的、足够大到的内存 仍然不能创建对象2. 浮动垃圾这是并发标记导致的并发标记确定a是存活对象但是在清理期间又将a置为了null从而出现GC之后仍然有死亡对象未被清理需要在后续GC时回收3. Concurrent Mode Failure单个GC线程垃圾未被清除前用户线程还在持续创建新对象空闲内存不足以满足新对象的内存分配多个GC线程GC线程A正在执行CMS垃圾清理GC线程B还在并发标记同时用户线程还在持续创建对象清理出来的内存 空余内存 不满足用户线程创建对象的需求本质是创建对象/对象晋升的速度 CMS清理的速度。CPU资源争夺4. 用户线程和GC线程争夺CPU执行权限导致业务处理能力下降。