HotSpot共有7種垃圾收集器,3個新生代垃圾收集器,3個老年代垃圾收集器,以及G1,一共構成7種可供選擇的垃圾收集器組合。
新生代與老年代垃圾收集器之間形成6種組合,每個新生代垃圾收集器都對應2種組合。
Serial Old(MSC)可以與所有新生代收集器進行組合,共3種組合
JVM僅指定新生代垃圾收集器的情況下,預設老年代採用Serial Old垃圾收集器(帶壓縮):
-XX:+UseSerialGC
Serial (DefNew) + Serial Old(Serial Mark Sweep Compact)
-XX:+UseParNewGC
Parallel (ParNew) + Serial Old(Serial Mark Sweep Compact)
-XX:+UseParallelGC
Parallel Scavenge (PSYoungGen) + Serial Old(Serial Mark Sweep Compact (PSOldGen))
注:在Parallel Scavenge收集器架構中本身有PS MarkSweep收集器來進行老年代收集,但由於PS MarkSweep與Serial Old實現非常接近,因此官方的許多資料都直接以Serial Old代替PS MarkSweep進行講解。
Parallel Old(帶壓縮)只能與Parallel Scavenge進行組合
-XX:+UseParallelOldGC
Parallel Scavenge (PSYoungGen) + Parallel Mark Sweep Compact (ParOldGen)
CMS(不帶壓縮)可以與Serial和ParNew進行組合,共2種組合
-XX:-UseParNewGC -XX:+UseConcMarkSweepGC
Serial (DefNew) + CMS(Concurrent Mark Sweep)
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC
Parallel (ParNew) + CMS(Concurrent Mark Sweep) + Serial Old(Serial Mark Sweep Compact)
G1(Garbage First),不需要搭配其他垃圾收集器
-XX:+UseG1GC
6種垃圾收集組合關係圖
新生代垃圾收集器
所有新生代垃圾收集器,都使用複製演算法,都會發生stop-the-world。由於絕大多數物件的生命週期通常比較短,在新生代被回收的可能性很大,新生代的垃圾回收通常可以回收大部分物件,因此採用複製演算法效率更高。
Serial
採用複製演算法,GC時發生stop-the-world,使用單個GC執行緒。
"Serial" is a stop-the-world, copying collector which uses a single GC thread.
ParNew
採用複製演算法,GC時發生stop-the-world,使用多個GC執行緒。
ParNew 與 Parallel Scavenge的一個主要區別是,ParNew可以與CMS進行搭配使用。
"ParNew" is a stop-the-world, copying collector which uses multiple GC threads. It differs from "Parallel Scavenge" in that it has enhancements that make it usable with CMS. For example, "ParNew" does the synchronization needed so that it can run during the concurrent phases of CMS.
Parallel Scavenge
採用複製演算法,GC時發生stop-the-world,使用多個GC執行緒。 吞吐量優先收集器,可控制最大垃圾收集停頓時間(-XX:MaxGCPauseMillis)與吞吐量大小(-XX:GCTimeRatio),支援GC自適應的調節策略(GC Ergonomics,對應引數-XX:+UseAdaptiveSizePolicy)。
"Parallel Scavenge" is a stop-the-world, copying collector which uses multiple GC threads.
老年代垃圾收集器
除了CMS,其他的老年代垃圾收集器GC時都是stop-the-world,都會在清理垃圾之後進行壓縮整理。
Serial Old
採用標記整理演算法,GC時發生stop-the-world,使用單個GC執行緒。
"Serial Old" is a stop-the-world, mark-sweep-compact collector that uses a single GC thread.
CMS
CMS採用標記清理演算法,是一個以低暫停時間為目標的垃圾收集器。GC時大部分時間併發執行,其中初始化標記和重新標記兩個階段仍然會發生stop-the-world,其餘階段都是併發執行。
"CMS" is a mostly concurrent, low-pause collector.
Java之CMS GC的7個階段:mp.weixin.qq.com/s/vmnBlrM7p…
Parallel Old
採用標記整理演算法,GC時發生stop-the-world,使用多個GC執行緒。
"Parallel Old" is a compacting collector that uses multiple GC threads.
G1
G1將整個堆劃分為多個大小相等的獨立區域(Region),保留新生代和老年代的分代概念(但兩者不再是物理隔離的)。
從整體來看是基於標記整理演算法,從區域性(兩個Region之間)來看是基於複製演算法。因此,可以避免產生記憶體空間碎片,防止發生併發模式失敗。
使用多個GC執行緒,每次優先回收價值最大的Region。
支援可預測的停頓時間模型,從而提高收集效率,降低stop-the-world的時間。
The Garbage First or G1 garbage collector is available in Java 7 and is designed to be the long term replacement for the CMS collector. The G1 collector is a parallel, concurrent, and incrementally compacting low-pause garbage collector that has quite a different layout from the other garbage collectors described previously.
推薦使用的2種GC組合
1.基於低停頓時間的垃圾收集器
-XX:+UseConcMarkSweepGC(該引數隱式啟用-XX:+UseParNewGC)
2.基於吞吐量優先的垃圾收集器
-XX:+UseParallelOldGC(該引數隱式啟用-XX:+UseParallelGC)
參考
blog.ragozin.info/2016/10/hot…
《深入理解Java虛擬機器 JVM高階特性與最佳實踐》周志明
《Java效能權威指南》
Java之CMS GC的7個階段:mp.weixin.qq.com/s/vmnBlrM7p…
個人公眾號
更多文章,請關注公眾號:二進位制之路