天天看點

java hotspot 預設垃圾回收器_HotSpot的7種垃圾收集器組合

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種垃圾收集組合關系圖

java hotspot 預設垃圾回收器_HotSpot的7種垃圾收集器組合

blogs.oracle.com/jonthecolle…

java hotspot 預設垃圾回收器_HotSpot的7種垃圾收集器組合

www.oracle.com/technetwork…

新生代垃圾收集器

所有新生代垃圾收集器,都使用複制算法,都會發生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)