HotSpot的7種垃圾收集器組合

HotSpot共有7種垃圾收集器,3個新生代垃圾收集器,3個老年代垃圾收集器,以及G1,一共構成7種可供選擇的垃圾收集器組合。html

新生代與老年代垃圾收集器之間造成6種組合,每一個新生代垃圾收集器都對應2種組合。java

Serial Old(MSC)能夠與全部新生代收集器進行組合,共3種組合

JVM僅指定新生代垃圾收集器的狀況下,默認老年代採用Serial Old垃圾收集器(帶壓縮)web

-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進行講解。oracle

Parallel Old(帶壓縮)只能與Parallel Scavenge進行組合

-XX:+UseParallelOldGC

Parallel Scavenge (PSYoungGen) + Parallel Mark Sweep Compact (ParOldGen)jvm

CMS(不帶壓縮)能夠與Serial和ParNew進行組合,共2種組合

-XX:-UseParNewGC -XX:+UseConcMarkSweepGC

Serial (DefNew) + CMS(Concurrent Mark Sweep)ide

-XX:+UseParNewGC -XX:+UseConcMarkSweepGC

Parallel (ParNew) + CMS(Concurrent Mark Sweep) + Serial Old(Serial Mark Sweep Compact)性能

G1(Garbage First),不須要搭配其餘垃圾收集器

-XX:+UseG1GC

6種垃圾收集組合關係圖

blogs.oracle.com/jonthecolle…

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)

2.基於吞吐量優先的垃圾收集器

-XX:+UseParallelOldGC(該參數隱式啓用-XX:+UseParallelGC)

www.oracle.com/technetwork…


參考

blogs.oracle.com/jonthecolle…

www.oracle.com/technetwork…

blog.ragozin.info/2016/10/hot…

docs.oracle.com/javase/8/do…

www.oracle.com/webfolder/t…

plumbr.io/handbook/ga…

《深刻理解Java虛擬機 JVM高級特性與最佳實踐》周志明

《Java性能權威指南》

Java之CMS GC的7個階段:mp.weixin.qq.com/s/vmnBlrM7p…

我的公衆號

更多文章,請關注公衆號:二進制之路

二進制之路
相關文章
相關標籤/搜索