《深入理解java虛擬機(jī) 第二版 JVM高級(jí)特性與最佳實(shí)踐》里面提到CMS垃圾收集器。
CMS垃圾收集器的垃圾回收分4個(gè)步驟:
- 初始標(biāo)記(CMS initial mark)
- 并發(fā)標(biāo)記(CMS concurrent mark)
- 重新標(biāo)記(重新標(biāo)記)
- 并發(fā)清除(CMS concurrent sweep)
初始標(biāo)記:僅僅標(biāo)記GC Root能直接關(guān)聯(lián)到的對(duì)象。
并發(fā)標(biāo)記:對(duì)初始標(biāo)記標(biāo)記過(guò)的對(duì)象,進(jìn)行trace(進(jìn)行追蹤,得到所有關(guān)聯(lián)的對(duì)象,進(jìn)行標(biāo)記)
重新標(biāo)記:(原文):為了修正并發(fā)標(biāo)記期間因用戶程序繼續(xù)運(yùn)作而導(dǎo)致標(biāo)記產(chǎn)生變動(dòng)的那一部分對(duì)象的標(biāo)記記錄。
導(dǎo)致產(chǎn)生變動(dòng)的那一部分對(duì)象,到底是哪部分對(duì)象?
網(wǎng)上查找很多資料,鮮有講清楚這個(gè)問(wèn)題的文章。結(jié)合找到的所有資料,我認(rèn)為應(yīng)該是這樣的:
重新標(biāo)記,重新從GC Root開(kāi)始查找新關(guān)聯(lián)的對(duì)象,并進(jìn)行標(biāo)記;而初始標(biāo)記、并行標(biāo)記兩個(gè)步驟標(biāo)記的對(duì)象,即使并行標(biāo)記過(guò)程中已經(jīng)沒(méi)有相關(guān)引用了,也不會(huì)再去清除這些對(duì)象的標(biāo)記(直到等到下一次GC發(fā)生的時(shí)候再去清除)
參考: