前言
GCEasy是一款非常好用的線上分析GC日志的工具,打開官網,直接上傳gc日志,也可以更加上門的要求進行壓縮上傳。

JVM memory size(jvm記憶體大小區域)
JVM memory size ,GCEasy展示了年輕代、老年代、元空間。JVM給配置設定的大小和程式運作過程中使用的峰值大小。
從JVM memory size展示的資訊,我們可以判斷是否需要做下面的幾件事情。
- 是否需要修改JVM記憶體(-Xms、-Xmx、-Xmn…)相關配置,比如年輕代和老年代峰值遠遠小于配置設定的大小,這個時候我們可以适當的減小記憶體設定。
- 是否需要調整年輕代和老年代的比例(-XX:NewSize(-Xns)、-XX:MaxNewSize(-Xmn)、-XX:SurvivorRatio=8)。比如老年大的峰值一直小于老年代申請的記憶體,這個時候我們可以稍微多分點空間給年輕代。
-
是否需要修改元空間(XX:MetaspaceSize,-XX:MaxMetaspaceSize)相關設定。
年輕代,老年代屬于堆區,元空間屬于非堆區(直接對接的是機器的記憶體)
Key Performance Indicators(關鍵性能名額)
Throughput表示的是吞吐量
Latency表示響應時間
Avg Pause GC Time 平均GC時間
Max Pause GC TIme 最大GC時間
Key Performance Indicators 給我們展示了GC吞吐量(應用程式線程用時占程式總用時的比例,越高越好),每次GC的平均耗時(建議控制在50ms以下),GC最長耗時,每個時間段的GC次數及占比資訊。
通過Key Performance Indicators顯示的資訊裡面,我們需要關注下面幾個問題:
- 吞吐量,應用花在非GC上的時間百分比(引用花在生産任務上的百分比)。是以吞吐量越高越好。
- 每次GC的平均耗時。越小越好,建議50ms以下。
- GC最長耗時。越小越好。如果你的應用是一個背景程式,并且任何請求不超過10秒,那麼GC最長耗時就不能超過10秒。
根據記憶體調優準則,以上這三個優化名額,最多隻能三者取其二
- 如果想要比較好的吞吐量和延遲,就需要在CPU消耗有所犧牲
- 入股想要比較好的吞吐量和CPU消耗,就需要在延遲上有所犧牲
- 如果想要比較好的延遲和CPU消耗,就需要在吞吐量上有所犧牲
Interactive Graphs(互動圈)
Interactive Graphs展示了
Heap after GC:GC之後堆的使用情況
Heap before GC:GC之前堆的使用情況
GC Duration:GC持續時間
Reclaimed Bytes:GC回收掉的垃圾對象的記憶體大小
Young Gen:年輕代堆的使用情況
Old Gen:老年代堆的使用情況
Meta Space:元空間的使用情況
A & P:每次GC的時候堆記憶體配置設定和晉升情況。其中紅色的線表示每次GC的時候年輕代裡面有多少記憶體(對象)晉升到了老年代。
第一部分是Heap after GC,GC後堆的記憶體圖,堆是用來存儲對象的,從圖中可以看出,随着GC的進行,垃圾回收器把對象都回收掉了,是以堆的大小逐漸增大。
第二部分是Heap before GC,這是GC前堆的使用率,可以看出随着程式的運作,堆使用率越來越高,堆被對象占用的記憶體越來越大。
第三部分是GC Duration Time,就是GC持續時間。一個GC事件的發生具有多個階段,而不同的垃圾回收器又有不同的階段,這裡展示不作細分。這些階段(例如并發标記,并發清除等)與程式線程一起并發運作,此時不會暫停程式線程。但是某些階段(例如初始标記,清除等)會暫停整個應用程式,是以此圖示描述的僅暫停階段所花費的時間。
第四部分表示的是GC回收掉的垃圾對象的記憶體大小。
第五部分表示的是Young Gen,年輕代的記憶體配置設定情況。對象都是朝生夕死,年輕代存放的就是剛剛産生的對象,每進行一次GC,都會GC掉很多垃圾對象,剩下的就是右GC Root關聯的對象,這些對象會年齡會逐漸增加,達到了一定門檻值就會晉升為老年代的對象。可以看到before GC表示的圖線随着時間的進行逐漸增大,也就是年輕代中對象越來越多,而GC事件發生後,年輕代中對象就會減少,也就是after GC圖線表示的記憶體變化趨勢。
第六部分是Old Gen,表示的是老年代的記憶體配置設定情況。細心的讀者會發現,為啥一開始before GC的記憶體大小比after GC的記憶體配置設定要少呢?這裡得先知道老年代存放的都是年齡大的對象,意思就是經過了多次GC都沒有被GC掉的對象,就會晉升為老年代的對象。是以這就解釋了為啥after GC記憶體要比before GC記憶體要大,因為每次GC過後,都會有年輕代的對象晉升為老年代對象。
第七部分是每次GC的時候堆記憶體配置設定和晉升情況。其中紅色的線表示每次GC的時候年輕代裡面有多少記憶體(對象)晉升到了老年代。
GC Statistics(GC統計資訊)
GC Statistics顯示一些GC的統計資訊。每種GC總共回收了多少記憶體、總共用了多長時間、平均時間、以及每種GC的單獨統計資訊啥的。
Object Stats(對象的一些統計資訊)
GC Causes(GC的原因資訊)
Memory Leak
由于記錄的程式沒有記憶體洩漏,是以這裡就沒有記憶體洩漏的日志資訊。此處可以診斷8種OOM中的5種(Java堆記憶體溢出,超出GC開銷限制,請求數組大小超過JVM限制,Permgen空間,元空間)。