做網(wǎng)站一個(gè)月30ip網(wǎng)絡(luò)推廣是網(wǎng)絡(luò)營(yíng)銷的基礎(chǔ)
JVM-CMS垃圾回收器
CMS垃圾回收的步驟
1. 初始標(biāo)記(InitialMarking)
- 這是一個(gè)STW的過(guò)程,并行標(biāo)記,只是標(biāo)記GC Roots能直接關(guān)聯(lián)到的對(duì)象。
- 由于GC Root直接關(guān)聯(lián)的對(duì)象少,因此STW時(shí)間比較短。
2. 并發(fā)標(biāo)記
- 非STW的過(guò)程,并發(fā)標(biāo)記,業(yè)務(wù)線程和GC線程同時(shí)運(yùn)行,由CPU進(jìn)行調(diào)度。這里標(biāo)記的算法是三色標(biāo)記算法
- 由于并發(fā)標(biāo)記,在標(biāo)記過(guò)程中會(huì)導(dǎo)致對(duì)象之間的引用發(fā)生變化,采用增量更新方法解決這個(gè)問(wèn)題
3. 重新標(biāo)記
- STW的過(guò)程,重新標(biāo)記在并發(fā)標(biāo)記過(guò)程中引用發(fā)生了變化或者新產(chǎn)生的對(duì)象。主要包括:
- 年輕代對(duì)象晉升到老年代,可能產(chǎn)生新的存活對(duì)象;
- 大對(duì)象直接被分配到老年代,可能產(chǎn)生新的存活對(duì)象;
- 老年代和年輕代對(duì)象的引用關(guān)系發(fā)生變化
4. 并發(fā)清除
- 最后,GC線程會(huì)清除不再被引用的對(duì)象,并回收他們占用的內(nèi)存空間
- 非STW,由于前面的標(biāo)記階段已經(jīng)將還在使用的對(duì)象標(biāo)記了出來(lái)
- 在此過(guò)程中新產(chǎn)生的垃圾只能等待下次GC
CMS特點(diǎn)與問(wèn)題
- Concurrent mark sweep并發(fā)標(biāo)記清除,在CMS之前都是STW的。
- 浮動(dòng)垃圾問(wèn)題
- CPU要求高:CMS默認(rèn)啟動(dòng)的回收線程數(shù)為(CPU數(shù)量+3)/4,當(dāng)CPU不足4個(gè)時(shí)候,效率低
- 標(biāo)記清除算法導(dǎo)致內(nèi)存碎片化嚴(yán)重
小結(jié):CMS從提出概念到實(shí)際完成用了10年多的時(shí)間,在此之前沒(méi)有過(guò)并發(fā)回收的垃圾回收器,因此它是一個(gè)垃圾回收器的里程碑,后來(lái)的G1也是基于CMS做的一些改進(jìn)。由于CMS是并發(fā)清除的新時(shí)代,它也存留了很多問(wèn)題,JDK任何版本都不會(huì)使用CMS作為默認(rèn)垃圾回收器。
三色標(biāo)記算法
- 它是一個(gè)標(biāo)記算法,不負(fù)責(zé)清除。
- 從root開(kāi)始遍歷鏈表,并用白、灰、黑三種顏色來(lái)標(biāo)記對(duì)象的狀態(tài)。
- 沒(méi)有被標(biāo)記過(guò)的為白色;被標(biāo)記過(guò)但是沒(méi)有遍歷完其子節(jié)點(diǎn)的標(biāo)記為灰色;對(duì)象本身及其子節(jié)點(diǎn)都被遍歷過(guò)的標(biāo)記為黑色。
- 多標(biāo)問(wèn)題:在標(biāo)記完成后對(duì)象引用斷開(kāi),被引用對(duì)象變?yōu)槔鴮?duì)象,但是已經(jīng)被標(biāo)記過(guò)了,產(chǎn)生浮動(dòng)垃圾,這個(gè)問(wèn)題并不大,等待下次GC即可
- 漏標(biāo)問(wèn)題:至少有一個(gè)黑色對(duì)象新增了對(duì)白色對(duì)象的引用,所有灰色對(duì)象指向該白色對(duì)象的引用都斷開(kāi)了,這個(gè)問(wèn)題比較嚴(yán)重,CMS使用增量更新的方法解決。
CMS如何解決漏標(biāo)問(wèn)題
incremental update:增量更新,關(guān)注引用的增加,如果要給黑色對(duì)象引用增加,將黑色對(duì)象標(biāo)記為灰色