上文我们已经介绍了CMS垃圾收集器的工作原理以及流程,本篇我们接着深入说明CMS垃圾收集器的缺点以及所导致的一些问题应该如何解决。先通过一张完整的图来回顾CMS工作的逻辑:图片
CMS的缺点分析
CMS是一款优秀的收集器, 它最主要的优点在名字上已经体现出来:并发收集、 低停顿, 一些官方公开文档里面也称之为“并发低停顿收集器”(Concurrent Low Pause Collector) 。CMS收集器是HotSpot虚拟机追求低停顿的第一次成功尝试, 但是它还远达不到完美的程度, 至少有以下三个明显的缺点:
1.并发导致CPU资源紧张
首先, CMS收集器对处理器资源非常敏感。事实上, 面向并发设计的程序都对处理器资源比较敏感。在并发阶段, 它虽然不会导致用户线程停顿, 但却会因为占用了一部分线程(或者说处理器的计算能力) 而导致应用程序变慢, 降低总吞吐量。
CMS默认启动的回收线程数是(处理器核心数量+3) /4, 也就是说, 如果处理器核心数在四个或以上, 并发回收时垃圾收集线程只占用不超过25%的处理器运算资源, 并且会随着处理器核心数量的增加而下降。但是当处理器核心数量不足四个时,CMS对用户程序的影响就可能变得很大。如果应用本来的处理器负载就很高, 还要分出一半的运算能力去执行收集器线程, 就可能导致用户程序的执行速度忽然大幅降低。
比如我们常见的机器是2核4G,那么分配给CMS的回收线程数= (2+3)/4 =1 个,直接占据了一半的CPU资源
因此CMS带来的第一个问题就是影响CPU的资源使用,特别是在本身CPU核数就少的情况下。
2.Con-current Mode Failure问题