HotSpot共有7種垃圾收集器,3個新生代垃圾收集器,3個老年代垃圾收集器,以及G1,一共構成7種可供選擇的垃圾收集器組合。html
新生代與老年代垃圾收集器之間造成6種組合,每一個新生代垃圾收集器都對應2種組合。java
JVM僅指定新生代垃圾收集器的狀況下,默認老年代採用Serial Old垃圾收集器(帶壓縮):web
Serial (DefNew) + Serial Old(Serial Mark Sweep Compact)算法
Parallel (ParNew) + Serial Old(Serial Mark Sweep Compact)架構
Parallel Scavenge (PSYoungGen) + Serial Old(Serial Mark Sweep Compact (PSOldGen))併發
注:在Parallel Scavenge收集器架構中自己有PS MarkSweep收集器來進行老年代收集,但因爲PS MarkSweep與Serial Old實現很是接近,所以官方的許多資料都直接以Serial Old代替PS MarkSweep進行講解。oracle
Parallel Scavenge (PSYoungGen) + Parallel Mark Sweep Compact (ParOldGen)jvm
Serial (DefNew) + CMS(Concurrent Mark Sweep)ide
Parallel (ParNew) + CMS(Concurrent Mark Sweep) + Serial Old(Serial Mark Sweep Compact)性能
-XX:+UseG1GC
全部新生代垃圾收集器,都使用複製算法,都會發生stop-the-world。因爲絕大多數對象的生命週期一般比較短,在新生代被回收的可能性很大,新生代的垃圾回收一般能夠回收大部分對象,所以採用複製算法效率更高。
採用複製算法,GC時發生stop-the-world,使用單個GC線程。
"Serial" is a stop-the-world, copying collector which uses a single GC thread.
採用複製算法,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.
採用複製算法,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,都會在清理垃圾以後進行壓縮整理。
採用標記整理算法,GC時發生stop-the-world,使用單個GC線程。
"Serial Old" is a stop-the-world, mark-sweep-compact collector that uses a single GC thread.
CMS採用標記清理算法,是一個以低暫停時間爲目標的垃圾收集器。GC時大部分時間併發執行,其中初始化標記和從新標記兩個階段仍然會發生stop-the-world,其他階段都是併發執行。
"CMS" is a mostly concurrent, low-pause collector.
Java之CMS GC的7個階段:mp.weixin.qq.com/s/vmnBlrM7p…
採用標記整理算法,GC時發生stop-the-world,使用多個GC線程。
"Parallel Old" is a compacting collector that uses multiple GC threads.
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.
-XX:+UseConcMarkSweepGC(該參數隱式啓用-XX:+UseParNewGC)
-XX:+UseParallelOldGC(該參數隱式啓用-XX:+UseParallelGC)
參考
blog.ragozin.info/2016/10/hot…
《深刻理解Java虛擬機 JVM高級特性與最佳實踐》周志明
《Java性能權威指南》
Java之CMS GC的7個階段:mp.weixin.qq.com/s/vmnBlrM7p…
更多文章,請關注公衆號:二進制之路