如上圖所示,垃圾收集算法有七個* * *,三個屬於年輕壹代,三個屬於老壹代,G1屬於跨越年輕壹代和老壹代的算法。
JVM會從年輕壹代和老壹代中選擇壹個算法進行組合,線表示哪些算法可以組合。
二。每個垃圾收集器的描述
1,連載(年輕壹代)
年輕的收藏家,它可以與串行舊和CMS結合使用。
使用復制算法
使用單線程進行垃圾回收會導致停世界,停用戶進程。
客戶端模式下年輕壹代的默認算法
GC日誌關鍵字:DefNew(默認新壹代)
圖標(序列+舊序列)
2.帕紐(年輕壹代)
新生代捕收劑,可與系列老藥和CMS結合使用。
使用復制算法
使用多線程進行垃圾回收會導致停世界,其他策略同串行。
服務器模式下年輕壹代的默認算法
使用-XX:ParallelGCthreads參數來限制垃圾收集線程的數量。
GC日誌關鍵字:ParNew(並行新壹代)
圖形(全新+舊系列)
3.並行清除(年輕壹代)
新生代捕收劑可以與串、老、並聯結合使用,但不能與CMS結合使用。
使用復制算法
使用多線程進行垃圾收集會導致世界停止。
註意系統吞吐量
-XX:MaxGCPauseMillis:設置大於0的毫秒數,收集器將嘗試在此時間內完成垃圾收集。
-XX:GCTimeRatio:大於0小於100的整數,即垃圾收集時間與總時間的比值。設置越小,垃圾收集花費的時間越少,這樣CPU就可以花更多的時間在系統運行上,提高吞吐量。
-XX:UseAdaptiveSizePolicy:參數開關。啟動後系統動態調整各種參數,比如-Xmn,-xx: survivor ratio,這是與ParNew collector的重要區別。
GC日誌關鍵字:PSYoungGen
4.連載老(老壹代)
老壹代采集器,可與所有年輕壹代采集器結合使用(老壹代串行采集器)
垃圾收集造成的內存碎片將使用“標記-排序”算法進行排序。
使用單線程進行垃圾回收會導致停世界,停用戶進程。
GC日誌關鍵字:任期
圖標(序列+舊序列)
5、平行?老(老壹代)
舊收集器只能與並聯掃氣收集器(舊版本的並聯掃氣收集器)結合使用。
垃圾收集造成的內存碎片將使用“標記-排序”算法進行排序。
並行清除+並行刪除可用於與吞吐量相關的系統中。
GC日誌關鍵字:ParOldGen
圖標(並行清除+並行舊)
6.CMS(並發標記清除高級生成)
舊收集器可以與Serial和ParNew結合使用。
使用“標記-清除”算法,可以通過設置參數在垃圾收集期間將內存碎片整理出來。
1,UserCMSCompactAtFullCollection:默認開啟,內存滿時進行碎片整理,碎片整理時需要停止用戶進程,即停止世界發生。
2.CMSFullGCsBeforeCompaction:設置在不壓縮的情況下執行完全GC的次數,然後在壓縮的情況下執行完全GC(默認值為0,表示每次進入完全GC時都執行碎片整理)。
CMS是並發算法,意思是垃圾收集和用戶同時進行,但不是所有階段都同時進行,在初始標記和重新標記階段仍然需要停世界。CMS垃圾收集分為四個階段。
1,CMS初始標記Stop World只標記GC根可以直接關聯的對象,速度快。
2.GC根跟蹤的並發標記(CMS並發標記)需要很長時間,並且用戶進程不會停止。
3.CMS備註?Stop the World糾正對象的標記發生變化的部分的標記記錄,因為用戶程序在並發標記期間繼續運行,暫停時間較長,但比並發標記時間短得多。
4.用戶進程在CMS並發掃的同時會導致新的垃圾,耗時較長,不會停止用戶進程。
適用於要求高響應時間的系統。
GC日誌關鍵詞:CMS-initial-mark、CMS-concurrent-mark-start、CMS-concurrent-mark、CMS-concurrent-preclean-start、CMS-concurrent-preclean、CMS-concurrent-sweep、CMS-concurrent-reset等。
劣勢
1,對CPU資源非常敏感。
2.CMS collector無法處理浮動垃圾,即清理時用戶進程同時產生的垃圾只能在下壹次GC時回收。
3.因為使用了“標記-清除”算法,所以會產生大量的碎片。
圖示
7、G1
G1采集器沒用過,所以從網上找了些教程給大家了解壹下。
並行和並發
世代收集
空間整合
可預測的暫停