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