上一篇 <<<G1能作為JDK9默認垃圾回收器的優(yōu)勢分析
下一篇 >>>GC中新生代進入老年代的方式匯總
三色標記算法:GCRoot如果想查找到存活對象,會根據(jù)可達分析算法分析,遍歷整個引用鏈 ,按照是否訪問過該對象分成三種不同的顏色盒子(容器):白色肚菠、灰色苞尝、黑色盒子肉渴。
白色:本對象沒有被訪問過 (沒有被GCRoot掃描過阐污,有可能是為垃圾對象)溺忧;
灰色:本對象已經(jīng)被訪問過(被GCRoot掃描過)融欧,且本對象中的屬性沒有被GCRoot掃描敏弃,該對象就是為灰色對象;如果該對象的屬性被掃描的情況下噪馏,從灰色變?yōu)楹谏?br> 黑色:本對象已經(jīng)被訪問過(被GCRoot掃描過)麦到,且本對象中的屬性已經(jīng)被GCRoot掃描過,該對象就是為黑色對象欠肾。
三色標記算法原理
a瓶颠、在初始階段的時候,所有的對象都是存放在白色容器中刺桃。
b粹淋、初始標記階段,GCRoot標記直接關聯(lián)對象置為灰色
c、并發(fā)標記階段桃移,掃描整個引用鏈屋匕,有子節(jié)點的話,則當前節(jié)點變?yōu)楹谏杞埽庸?jié)點變?yōu)榛疑?br>
d过吻、在白色盒子剩下的對象都是為沒有被GCRoot關聯(lián)的對象,可能會被垃圾回收機制清理第步。
e疮装、下次GCRoot起點從灰色節(jié)點開始計算
三色標記算法缺陷:在并發(fā)標記階段的時候,因為用戶線程與GC線程同時運行粘都,有可能會產(chǎn)生多標或者漏標廓推;
多標--多標記(浮動垃圾)
漏標--漏標記
浮動垃圾
1.并發(fā)標記:用戶與GC線程同時運行,假設現(xiàn)在掃描到C對象翩隧,B對象變?yōu)楹谏梗脩艟€程執(zhí)行C的屬性E=null,GC線程掃描C對象引用鏈,認為E對象是為可達對象堆生,但是C對象根本沒有引入到E對象专缠,E對象應該是為垃圾對象,這種問題淑仆,可以在重新標記階段(修正)修復涝婉。
2.并發(fā)清除階段:用戶與GC線程同時運行,會產(chǎn)生新的對象但是沒有及時被GC清理蔗怠。 只能在下一次GC清理垃圾的修復墩弯。
漏標問題
1.用戶線程先執(zhí)行C的E屬性=null;GC線程的GcRoot就掃描不到E寞射。Gc就認為E對象就是為垃圾對象渔工,不可達對象。
2.用戶線有執(zhí)行B.E屬性=E桥温;E對象就是應該是為可達對象引矩。
3.因為GCRoot是從C開始,不會從黑色的B開始侵浸,就會導致漏標的情況發(fā)生旺韭。
漏標的問題滿足兩個條件:
1.至少有一個黑色對象指向了白色對象
2.所有灰色對象掃描完整個鏈時,刪除之前所有白色對象掏觉。
1.CMS如何解決漏標問題---寫屏障+增量更新方式
滿足一個條件(灰色對象與白色對象斷開連接)茂翔,在并發(fā)標記階段當我們黑色對象(B)引用關聯(lián)白色對象(E),記錄下B黑色對象履腋。
在重新標記階段(所有用戶線程暫停),有將B對象變?yōu)榛疑珜ο髮⒄麄€引用鏈全部掃描。
缺點:遍歷B整個鏈的效率非常低遵湖,有可能會導致用戶線程等待的時間非常長悔政。
2.G1如何解決漏標問題---原始快照方式
在C斷開E的時候,會記錄原始快照延旧,在重新標記階段的時候以白色對象變?yōu)榛疑珵槠鹗键c掃描整個鏈谋国,本次GC是不會被清理。
好處:如果假設B(黑色對象)引入該白色對象的時候迁沫,無需做任何遍歷效率是非常高芦瘾。
缺點:如果假設B(黑色對象) 沒有引入該白色對象的時候,該白色對象在本次GC繼續(xù)存活集畅,只能放在下一次GC在做并發(fā)標記的時候清理近弟。
tips:以浮動垃圾(占內存空間)換讓我們用戶線程能夠暫停的時間更加短。
總結:
CMS收集器解決漏標問題:增量方式 如果現(xiàn)在B(黑色)對象引入白色對象挺智,寫屏障祷愉。
好處:避免浮動垃圾,缺點掃描整個引用鏈效率比較低赦颇。
G1收集器解決漏標問題:原始快照方式二鳄。
好處:效率非常高,無需掃描整個引用鏈媒怯,缺點:可能會產(chǎn)生浮動垃圾订讼。
相關文章鏈接:
<<<JVM整體內存結構的圖解,直觀明了
<<<javap命令查看對象信息及操作方法在JVM層的實現(xiàn)原理
<<<javap命令反查匯編指令匯總
<<<ClassLoader類加載器順序Demo測試與雙親委派源碼解讀
<<<自定義SPI和熱部署技術破壞類加載器的雙親委派模式
<<<JVM中對象如何完成空間分配和初始化工作
<<<JVM元空間(方法區(qū))和棧內存溢出原因及解決方案
<<<JVM堆內存溢出和內存泄露問題定位和解決
<<<JVM常見死鎖問題產(chǎn)生原因和多種診斷方式
<<<服務器CPU飆升為100%問題排查及如何避免
<<<JVM內存診斷命令和排查工具匯總
<<<JVM新生代老年代算法匯總圖解
<<<JVM垃圾回收不要手動System.gc的真正原因
<<<JVM垃圾回收引用計數(shù)法和根搜索算法圖解
<<<JVM垃圾回收STW(Stop-The-World)代碼演示
<<<JVM垃圾回收器的發(fā)展歷程及使用場景匯總
<<<JVM串行并行垃圾回收器的關注點
<<<一張圖看懂CMS垃圾回收器的底層原理
<<<G1能作為JDK9默認垃圾回收器的優(yōu)勢分析
<<<GC中新生代進入老年代的方式匯總
<<<GC常用日志參數(shù)配置及分析工具說明
<<<FullGC扇苞、MinorGC欺殿、STW等常見問題如何解答
<<<JVM性能調優(yōu)的評估指標及調優(yōu)示例