天天看點

GC日志分析神器-GCEasy詳解

前言

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

GC日志分析神器-GCEasy詳解

JVM memory size(jvm記憶體大小區域)

GC日志分析神器-GCEasy詳解

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時間

GC日志分析神器-GCEasy詳解

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的進行,垃圾回收器把對象都回收掉了,是以堆的大小逐漸增大。

GC日志分析神器-GCEasy詳解

第二部分是Heap before GC,這是GC前堆的使用率,可以看出随着程式的運作,堆使用率越來越高,堆被對象占用的記憶體越來越大。

GC日志分析神器-GCEasy詳解

第三部分是GC Duration Time,就是GC持續時間。一個GC事件的發生具有多個階段,而不同的垃圾回收器又有不同的階段,這裡展示不作細分。這些階段(例如并發标記,并發清除等)與程式線程一起并發運作,此時不會暫停程式線程。但是某些階段(例如初始标記,清除等)會暫停整個應用程式,是以此圖示描述的僅暫停階段所花費的時間。

GC日志分析神器-GCEasy詳解

第四部分表示的是GC回收掉的垃圾對象的記憶體大小。

GC日志分析神器-GCEasy詳解

第五部分表示的是Young Gen,年輕代的記憶體配置設定情況。對象都是朝生夕死,年輕代存放的就是剛剛産生的對象,每進行一次GC,都會GC掉很多垃圾對象,剩下的就是右GC Root關聯的對象,這些對象會年齡會逐漸增加,達到了一定門檻值就會晉升為老年代的對象。可以看到before GC表示的圖線随着時間的進行逐漸增大,也就是年輕代中對象越來越多,而GC事件發生後,年輕代中對象就會減少,也就是after GC圖線表示的記憶體變化趨勢。

GC日志分析神器-GCEasy詳解

第六部分是Old Gen,表示的是老年代的記憶體配置設定情況。細心的讀者會發現,為啥一開始before GC的記憶體大小比after GC的記憶體配置設定要少呢?這裡得先知道老年代存放的都是年齡大的對象,意思就是經過了多次GC都沒有被GC掉的對象,就會晉升為老年代的對象。是以這就解釋了為啥after GC記憶體要比before GC記憶體要大,因為每次GC過後,都會有年輕代的對象晉升為老年代對象。

GC日志分析神器-GCEasy詳解

第七部分是每次GC的時候堆記憶體配置設定和晉升情況。其中紅色的線表示每次GC的時候年輕代裡面有多少記憶體(對象)晉升到了老年代。

GC日志分析神器-GCEasy詳解

GC Statistics(GC統計資訊)

GC日志分析神器-GCEasy詳解

GC Statistics顯示一些GC的統計資訊。每種GC總共回收了多少記憶體、總共用了多長時間、平均時間、以及每種GC的單獨統計資訊啥的。

Object Stats(對象的一些統計資訊)

GC日志分析神器-GCEasy詳解

GC Causes(GC的原因資訊)

GC日志分析神器-GCEasy詳解

Memory Leak

由于記錄的程式沒有記憶體洩漏,是以這裡就沒有記憶體洩漏的日志資訊。此處可以診斷8種OOM中的5種(Java堆記憶體溢出,超出GC開銷限制,請求數組大小超過JVM限制,Permgen空間,元空間)。

繼續閱讀