使用VisualVM檢視Java Heap Dump
-
使用了jmap工具實現,手工觸發fullGC,運維常備
jmap -histo:live <pid>
或者
jmap -dump:live,file=dump_001.bin PID
會生成dump_001.bin檔案
瀏覽Heap Dump
可以使用VisualVM瀏覽heap dump檔案的內容,從而快速檢視在堆中分配的物件。Heap dumps在主視窗的heap dump子標籤頁中顯示。你可以開啟儲存在本地的heap dump檔案(.hprof)或者使用VisualVM捕獲正在執行的程式的heap dumps。
一個heap dump是Java虛擬機器(JVM)在某一時刻所有物件的快照。JVM從堆中為所有的類例項和陣列分配記憶體。當一個物件不再被使用並且沒有對它的引用時,垃圾回收器回收其堆記憶體。通過檢視堆,你可以找到物件建立的位置,發現物件的引用。如果JVM試圖從堆中移除不再需要的物件時失敗了,VisualVM可以定位到離該物件最近的垃圾回收根(garbage collecting root)。
開啟Heap Dump檔案
如果你有一個儲存在本地的heap dump檔案,在VisualVM中通過File > Load選單項載入該檔案。VisualVM能開啟.hprof格式的heap dumps檔案。開啟後,heap dump作為主視窗的一個子標籤頁。
捕獲Heap Dump
可以使用VisualVM捕獲一個本地執行的應用程式的heap dump。捕獲的heap dump檔案是一個臨時檔案,關閉VisualVM後自動刪除,若要保留,需要將其另存為檔案。
可通過以下兩種方法捕獲heap dump:
- 在左側“Application”(應用程式)子視窗中右擊相應的應用程式,選擇Heap Dump(堆Dump)。
- 在Monitor(監視)子標籤頁中點選Heap Dump(堆Dump)按鈕。
本地應用程式的Heap dumps作為應用程式標籤頁的一個子標籤頁開啟。同時,heap dump在左側的Application(應用程式)欄中對應一個含有時間戳的節點。右擊這個節點選擇save as(另存為)即可將heap dump儲存到本地。
瀏覽Heap Dump
VisualVM提供了一下視覺化檢視來瀏覽heap dumps:
Summary View(概述)
開啟一個heap dump時,VisualVM預設顯示“概述”標籤頁。概述檢視顯示了該heap dump的捕獲環境和其他系統屬性。
Classes View(類)
類檢視顯示了類列表和其對應的例項數量、所佔比例。右擊類名選擇“Show in Instances View(在例項檢視中顯示)”即可檢視指定類的例項列表。
點選列頭可按指定列排序。可以使用類列表下方的“類名過濾器(Class Name Filter)”來過濾類,也可以通過右擊一個類名選擇“Show Only Subclasses(只顯示子類)”來將顯示結果限制為指定類的子類。
Instances View(例項數)
例項數檢視顯示了選中類的物件例項。在“例項(Instance)”欄中選中一個例項,右側的“欄位(Fields)”和“引用(References)”欄將顯示該例項對應的欄位和對它的引用。在引用欄中,右擊一條並選擇“顯示最近的垃圾回收根節點(Show Nearest GC Root)”就會顯示最近的垃圾回收根節點。