三色標記算法思想
三色標記法是一種垃圾回收法拳缠,它可以讓 JVM 不發(fā)生或僅短時間發(fā)生 STW(Stop The World)墩新,從而達到清除 JVM 內(nèi)存垃圾的目的。
三色標記法將對象的顏色分為了黑窟坐、灰海渊、白,三種顏色哲鸳。
- 黑色:該對象已經(jīng)被標記過了臣疑,且該對象下的屬性也全部都被標記過了。(程序所需要的對 象);
- 灰色:對象已經(jīng)被垃圾收集器掃描過了徙菠,但是對象中還存在沒有掃描的引用(GC 需要從此對 象中去尋找垃圾);
- 白色:表示對象沒有被垃圾收集器訪問過讯沈,即表示不可達。
CMS 解決辦法:增量更新
在應(yīng)對漏標問題時婿奔,CMS 使用了增量更新(Increment Update)方法來做缺狠,在一個未被標記 的對象(白色對象)被重新引用后,引用它的對象若為黑色則要變成灰色萍摊,在下次二次標記時 讓 GC 線程繼續(xù)標記它的屬性對象(但還是存在漏標的問題)挤茄。
CMS 另兩個致命缺陷
CMS 采用了 Mark-Sweep 算法,最后會產(chǎn)生許多內(nèi)存碎片冰木,當(dāng)?shù)揭欢〝?shù)量時驮樊,CMS 無法 清理這些碎片了,CMS 會讓Serial Old GC 垃圾處理器來清理這些垃圾碎片片酝,而垃圾處理器是單線程操作進行清理垃圾的囚衔,效率很低。
所以使用 CMS 就會出現(xiàn)一種情況雕沿,硬件升級了练湿,卻越來越卡頓,其原因就是因為進行時审轮,效率過低肥哎。
解決方案:使用 Mark-Sweep-Compact 算法,減少垃圾碎片
調(diào)優(yōu)參數(shù)(配套使用):
- -XX:+UseCMSCompactAtFullCollection 開啟 CMS 的壓縮 --
- XX:CMSFullGCsBeforeCompaction 默認為 0疾渣,指經(jīng)過多少次 CMS FullGC 才進行壓縮 當(dāng) JVM 認為內(nèi)存不夠篡诽,再使用 CMS 進行并發(fā)清理內(nèi)存可能會發(fā)生 OOM 的問題,而不得不進行 榴捡, 是單線程垃圾回收杈女,效率低
解決方案:降低觸發(fā)CMS GC的閾值,讓浮動垃圾不那么容易占滿老年代
調(diào)優(yōu)參數(shù):
- -XX:CMSInitiatingOccupancyFraction 92% 可以降低這個值吊圾,讓老年代占用率達到該值就 進行 CMS GC
G1 解決辦法:SATB
SATB(Snapshot At The Beginning), 在應(yīng)對漏標問題時达椰,G1 使用了 SATB 方法來做,具體 流程:
- 在開始標記的時候生成一個快照圖標記存活對象
- 在一個引用斷開后,要將此引用推到 GC 的堆棧里项乒,保證白色對象(垃圾)還能被 GC 線程掃描到(在write barrier(寫屏障)里把所有舊的引用所指向的對象都變成非白的)
- 配合 Rset啰劲,去掃描哪些 Region 引用到當(dāng)前的白色對象,若沒有引用到當(dāng)前對象檀何,則回收
G1 會不會進行 Full GC?
會蝇裤,當(dāng)內(nèi)存滿了的時候就會進行Full GC。 解決方案:
- 加大內(nèi)存;
- 提高 CPU 性能频鉴,加快 GC 回收速度栓辜,而對象增加速度趕不上回收速度,則 Full GC 可以避免;
- 降低進行 Mixed GC 觸發(fā)的閾值砚殿,讓 Mixed GC 提早發(fā)生(默認 45%)