CMS垃圾收集器工作原理:
初始标记阶段:所有用户线程暂停,标记出GC Roots能直接关联的对象并发标记阶段:从GC Roots直接关联对象开始遍历整个对象图的过程,可以和用户线程并发执行重新标记阶段:所有用户线程暂停,修正并发标记期间,因用户线程继续运作而导致标记产生变动部分对象的标记记录并发清除阶段:清理标记阶段判断为死亡的对象,释放空间内存,可以和用户线程并发执行
什么是浮动垃圾呢?
答:在并发标记阶段本来可达的对象,由于用户线程的作用变得不可达了,即产生新的垃圾对象,CMS将无法对这些垃圾对象进行标记,最终导致这些新产生的垃圾对象没有被及时回收。
在重新标记阶段会修正由于用户线程运作而导致对象的标记产生变动的记录,那为什么还有浮动垃圾产生?
答:由于标记阶段是从 GC Roots开始标记可达对象,那么在并发标记阶段可能产生两种变动:
1)本来可达的对象,变得不可达了
2)本来不可达的对象,变得可达了
如果在并发标记阶段中,用户线程new了一个对象,而它在初始标记和并发标记中无法从GC Roots可达,如果没有重新标记阶段将这个对象标记为可达,那么在并发清除阶段被回收,这是严重的错误。
相比之下,浮动垃圾是可容忍的问题,那为什么重新标记阶段不处理第一种变动呢?由于从可达变为不可达的变化需要重新从GC Roots开始遍历,相当于再次完成初始标记和并发标记的工作,这样会造成增加重新标记阶段的开销,所带来的暂停时间是追求低延迟的CMS不能容忍的。
32041018