1. 程式人生 > >Java分析系列之六:JVM Heap Dump(堆轉儲檔案)的生成和MAT的使用

Java分析系列之六:JVM Heap Dump(堆轉儲檔案)的生成和MAT的使用

前面的文章詳細講述了分析Thread Dump檔案,實際在處理Java記憶體洩漏問題的時候,還需要分析JVM堆轉儲檔案來進行定位。

目錄 [隱藏]

JVM Heap Dump(堆轉儲檔案)的生成

正如Thread Dump檔案記錄了當時JVM中執行緒執行的情況一樣,Heap Dump記錄了JVM中堆記憶體執行的情況。
可以通過以下幾種方式生成Heap Dump檔案:

使用 jmap 命令生成

jmap 命令是JDK提供的用於生成堆記憶體資訊的工具,可以執行下面的命令生成Heap Dump:

jmap -dump:live,format=b,file=heap-dump.bin <pid>

其中的pid是JVM程序的id,heap-dump.bin是生成的檔名稱,在執行命令的目錄下面。推薦此種方法。

使用 JConsole 生成

JConsole是JDK提供的一個基於GUI檢視JVM系統資訊的工具,既可以管理本地的JVM,也可以管理遠端的JVM,可以通過下圖的 dumpHeap 按鈕生成 Heap Dump檔案。

在JVM中增加引數生成

在JVM的配置引數中可以新增 -XX:+HeapDumpOnOutOfMemoryError 引數,當應用丟擲 OutOfMemoryError 時自動生成dump檔案;
在JVM的配置引數中新增 -Xrunhprof:head=site

引數,會生成java.hprof.txt 檔案,不過這樣會影響JVM的執行效率,不建議在生產環境中使用(未親測)。

常見的Heap Dump檔案分析工具

JVM Heap Dump檔案可以使用常用的分析工具如下:

jhat

jhat 是JDK自帶的用於分析JVM Heap Dump檔案的工具,使用下面的命令可以將堆檔案的分析結果以HTML網頁的形式進行展示:

jhat <heap-dump-file>

其中 heap-dump-file 是檔案的路徑和檔名,可以使用 -J-Xmx512m 引數設定命令的記憶體大小。執行成功之後顯示如下結果:

Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

這個時候訪問 http://localhost:7000/ 就可以看到結果了。

Eclipse Memory Analyzer(MAT)

Eclipse Memory Analyzer(MAT)是Eclipse提供的一款用於Heap Dump檔案的工具,操作簡單明瞭,下面將詳細進行介紹。

IBM Heap Analyzer

IBM Heap Analyzer 是IBM公司推出的一款用於分析Heap Dump資訊的工具,下載之後是一個jar檔案,執行結果如下:

Memory Analyzer的安裝和使用

如前文所述,Eclipse Memory Analyzer(簡稱MAT)是一個功能豐富且操作簡單的JVM Heap Dump分析工具,可以用來輔助發現記憶體洩漏減少記憶體佔用。
使用 Memory Analyzer 來分析生產環境的 Java 堆轉儲檔案,可以從數以百萬計的物件中快速計算出物件的 Retained Size,檢視是誰在阻止垃圾回收,並自動生成一個 Leak Suspect(記憶體洩露可疑點)報表。

下載與安裝

Eclipse Memory Analyzer(MAT)支援兩種安裝方式,一是Eclipse外掛的方式,另外一個就是獨立執行的方式,建議使用獨立執行的方式。
http://www.eclipse.org/mat/downloads.php 下載安裝MAT,啟動之後開啟 File - Open Heap Dump... 選單,然後選擇生成的Heap DUmp檔案,選擇 "Leak Suspects Report",然後點選 "Finish" 按鈕。

主介面

第一次開啟因為需要分析dump檔案,所以需要等待一段時間進行分析,分析完成之後dump檔案目錄下面的檔案資訊如下:

上圖中 heap-27311.bin 檔案是原始的Heap Dump檔案,zip檔案是生成的html形式的報告檔案。

開啟之後,主介面如下所示:

接下來介紹介面中常用到的功能:

Overview

Overview檢視,即概要介面,顯示了概要的資訊,並展示了MAT常用的一些功能。

  • Details 顯示了一些統計資訊,包括整個堆記憶體的大小、類(Class)的數量、物件(Object)的數量、類載入器(Class Loader)的數量。
  • Biggest Objects by Retained Size 使用餅圖的方式直觀地顯示了在JVM堆記憶體中最大的幾個物件,當游標移到餅圖上的時候會在左邊Inspector和Attributes視窗中顯示詳細的資訊。
  • Actions 這裡顯示了幾種常用到的操作,算是功能的快捷方式,包括 Histogram、Dominator Tree、Top Consumers、Duplicate Classes,具體的含義和用法見下面;
  • Reports 列出了常用的報告資訊,包括 Leak Suspects和Top Components,具體的含義和內容見下;
  • Step By Step 以嚮導的方式引導使用功能。

Histogram Histogram

直方圖,可以檢視每個類的例項(即物件)的數量和大小。

Dominator Tree

支配樹,列出Heap Dump中處於活躍狀態中的最大的幾個物件,預設按 retained size進行排序,因此很容易找到佔用記憶體最多的物件。

OQL

MAT提供了一個物件查詢語言(OQL),跟SQL語言類似,將類當作表、物件當作記錄行、成員變數當作表中的欄位。通過OQL可以方便快捷的查詢一些需要的資訊,是一個非常有用的工具。

Thread Overview

此工具可以檢視生成Heap Dump檔案的時候執行緒的執行情況,用於執行緒的分析。

Run Expert System Test

可以檢視分析完成的HTML形式的報告,也可以開啟已經產生的分析報告檔案,子選單項如下圖所示:

常用的主要有Leak Suspects和Top Components兩種報告:

  • Leak Suspects 可以說是非常常用的報告了,該報告分析了 Heap Dump並嘗試找出記憶體洩漏點,最後在生成的報告中對檢測到的可疑點做了詳細的說明;
  • Top Components 列出佔用總堆記憶體超過1%的物件。

Open Query Browser

提供了在分析過程中用到的工具,通常都整合在了右鍵選單中,在後面具體舉例分析的時候會做詳細的說明。如下圖:

這裡僅針對在 Overview 介面中的 Acations中列出的兩項進行說明:

  • Top Consumers 按類、類載入器和包分別進行查詢,並以餅圖的方式列出最大的幾個物件。選單開啟方式如下:
  • Duplicate Classes 列出被載入多次的類,結果按類載入器進行分組,目標是載入同一個類多次被類載入器載入。使用該工具很容易找到部署應用的時候使用了同一個庫的多個版本。選單開啟方式如下圖:

Find Object by address

通過十六進位制的地址查詢對應的物件,見下圖:

上面簡單介紹了MAT工具的功能列表,下一篇文章將要通過例項詳細進行分析。

記憶體洩漏