天天看點

Java垃圾收集器分析和總結GC分析

GC分析

JVM基本參數配置

#初始化堆大小 -Xms
-XX:InitialHeapSize=536870912
#最大堆大小 -Xmx
-XX:MaxHeapSize=536870912
#年輕帶初始化大小 -Xmn設定後,表示-XX:NewSize和-XX:MaxNewSize相等
-XX:NewSize=402653184
#年輕代最大大小
-XX:MaxNewSize=402653184
#Survivor區占年輕帶的比例 此處為1/8,因為存在兩個Survivor
-XX:SurvivorRatio=8
#棧大小 -Xss,機關KB
-XX:ThreadStackSize=256
#元空間大小
-XX:MetaspaceSize=33554432
#最大元空間大小
-XX:MaxMetaspaceSize=188743680
           

串行收集器Serial

JVM參數配置及說明

GC收集器使用

-XX:+UseSerialGC

,以啟用SerialGC,開啟該參數後年輕代和老年代都使用串行回收器,即年輕代使用Serial GC,老年代使用Serial Old GC。

GCEasy分析圖

Java垃圾收集器分析和總結GC分析
Java垃圾收集器分析和總結GC分析
Java垃圾收集器分析和總結GC分析
Java垃圾收集器分析和總結GC分析

Serial小結

從上圖的基本可以分析出,由于GC造成的STW時長總共是2.34s(GC日志總時長大約是15分鐘左右,從啟動開始),期間共發生了3次Full GC,由于是串行,是以3次Full GC總耗時為810ms。

并行收集器ParNew&Parallel GC

ParNew

JVM參數配置及說明

GC收集器使用-XX:+UseParNewGC,以啟用ParNew并行收集器,ParNew是Serial的多線程版本,開啟這個收集器後新生代使用并行回收器,老年代仍然使用串行回收器(Serial Old)。

GCEasy分析圖

Java垃圾收集器分析和總結GC分析
Java垃圾收集器分析和總結GC分析
Java垃圾收集器分析和總結GC分析
Java垃圾收集器分析和總結GC分析

ParNew小結

ParNew的GC總時間為1.78s,Serial的GC總時間為2.34s,從GC的總時間來看,并行垃圾收集器比串行的效率要高。主要展現在MonitorGC的效率上,ParNew的MonitorGC總時間為0.88s,而Serial的Monitor的總時間為1.53s,MonitorGC的時間減低了73.8%,由此來看,在年輕代使用并行收集器的效率比串行的效率要高出很多。

Parallel GC

JVM參數配置及說明

GC收集器使用

-XX:+UseParallelOldGC

,以啟用Parallel并行收集器。開啟該參數後,新生代和老年代都使用并行收集器。

Parallel收集器提供了自适應的調節政策

-XX:+UseAdaptiveSizePolicy

,即JVM會根據實際運作情況動态調整新生代大小、Eden和Sruvivor區的比例、晉升老年代對象大小等相關參數。

GCEasy分析圖

Java垃圾收集器分析和總結GC分析
Java垃圾收集器分析和總結GC分析
Java垃圾收集器分析和總結GC分析

Parallel小結

Parallel收集器GC總耗時1.67s,比ParNew的GC總時長1.78s略有所減低,其中Full GC的總耗時為740ms,比ParNew的Full GC總耗時880ms減少了18.9%,此減少耗時得益于Parallel的老年代的并行收集器,由于年前都是并行收集器,幾乎沒有差別。

CMS收集器

JVM參數配置及說明

GC收集器使用

-XX:+UserConcMarkSweepGC

,以啟用CMS,是一個并發标記清除的收集器,即在GC期間可以和業務線程一起運作。CMS是老年代收集器,開啟後,年輕代預設使用ParNew并行收集器。CMS收集器使用的标記清除算法,運作過程分為四個步驟,初始标記->并發标記->重新标記->并發清除,由于在整個過程中存在并發的步驟(并發标記和并發清除),是以總體上CMS是一款并發收集器。

GCEasy分析圖

Java垃圾收集器分析和總結GC分析
Java垃圾收集器分析和總結GC分析
Java垃圾收集器分析和總結GC分析

CMS小結

從上圖中可以看出,CMS暫定業務線程的總時長為200ms(FinalRemakr) + 50ms(InitialMark) = 250ms,相比較Parallel Old收集器在老年代的耗時740ms降低了很多。

G1

JVM參數配置及說明

虛拟機參數配置-XX:+UseG1GC,以啟用G1收集器。

GCEasy分析圖

Java垃圾收集器分析和總結GC分析
Java垃圾收集器分析和總結GC分析
Java垃圾收集器分析和總結GC分析
Java垃圾收集器分析和總結GC分析
Java垃圾收集器分析和總結GC分析

G1小結

從上圖可以看出,G1收集器花費的總耗時為1.4+0.15=1.55s。而且G1收集器并未發送Full GC,總體而言G1收集器更為全面,不過G1收集器還有些JVM參數未調配,需要不斷嘗試調配參數,使其達到最優狀态。

總結

從上面使用不同的垃圾收集器後的GC情況來開,

由于串行收集器使用的是單核心進行垃圾回收,造成的STW時間最長。

并行收集器時串行收集器的更新版本,在垃圾回收時使用了多核心進行并行手機,這樣就可以縮短垃圾回收的時候,進而減少STW時間。

CMS收集器則再并行收集器的基礎上再次進行了改良,作用于老年代,總體上來看使用了标記-清除算法,但由于清除後造成的空間碎片問題,CMS不得不在設定的幾次Full GC進行記憶體整理,進而保證記憶體的規整。CMS收集過程分為四個階段:

初始标記,并發标記,重新标記,并發清除

。由于并發标記和并發清除階段是并發操作的,也就是說在這兩個階段垃圾回收動作和使用者業務動作可以同時運作,是以這兩個階段不是STW的,是以總體上而言CMS減低地業務線程的停頓時間。

G1收集器是面向全堆的收集器,垃圾回收過程也分為四個階段:

初始标記,并發标記,最終标記,篩選回收

,從四階段的名稱來看,并發過程隻有并發階段,其他階段仍然要暫停使用者線程,即STW,和CMS相比較而言,其停頓時間會略微有所增加,但其目标是完成一個延遲可控的高吞吐量的全局收集器。