一、CMS垃圾回收原理图:
注:图中多个CPU只是模拟多个线程工作,事实上并发是指一个CPU内多个线程同时参与争夺CPU时间片的过程。在初始标记阶段,只有用于垃圾回收的线程在运行,其他用户线程阻塞状态。但在并发标记与并发清理阶段,垃圾回收的线程与未用于垃圾回收的其他用户线程一起工作,于是有了无法清理浮动垃圾与并发失败问题:
1.无法清理浮动垃圾:
在CMS的并发标记和并发清理阶段,用户线程还在继续运行,就还会伴随有新的垃圾对象不断产生,但这一部分垃圾对象是出现在标记过程结束以后,CMS无法在当次收集中处理掉它们,只好留到下一次垃圾收集时再清理掉。这一部分垃圾称为“浮动垃圾”。
2. 并发失败:
由于在垃圾回收阶段用户线程还在并发运行,那就还需要预留足够的内存空间提供给用户线程使用,因此CMS不能像其他回收器那样等到老年代几乎完全被填满了再进行回收,必须预留一部分空间供并发回收时的程序运行使用。默认情况下,当老年代使用了 92% 的空间后就会触发 CMS 垃圾回收,这个值可以通过 -XX**😗* CMSInitiatingOccupancyFraction 参数来设置。