CMS:以获取最短回收停顿时间为目标的收集器,基于并发“标记清理”实现
有人会好奇为什么标记清理算法会产生内存碎片!但是CMS仍采用这种算法呢?
答案是:因为CMS作为第一款实现用户线程和收集线程并发执行的收集器!当时的设计理念是减少停顿时间,最好是能并发执行!但是问题来了,如要用户线程也在执行,那么就不能轻易的改变堆中对象的内存地址!不然会导致用户线程无法定位引用对象,从而无法正常运行!而标记整理算法和复制算法都会移动存活的对象,这就与上面的策略不符!因此CMS采用的是标记清理算法!
初始标记-->并发标记---->重新标记---->并发清理
过程:
1、初始标记:独占PUC,stop-the-world, 仅标记GCroots能直接关联的对象
2、并发标记:可以和用户线程并发执行,通过GCRoots Tracing 标记所有可达对象</