Java內存泄漏分析系列之六:JVM Heap Dump(堆轉儲文件)的生成和MAT的使用

原文地址:http://www.javatang.comphp

JVM Heap Dump(堆轉儲文件)的生成

正如Thread Dump文件記錄了當時JVM中線程運行的狀況同樣,Heap Dump記錄了JVM中堆內存運行的狀況。
能夠經過如下幾種方式生成Heap Dump文件:html

使用 jmap 命令生成

jmap 命令是JDK提供的用於生成堆內存信息的工具,能夠執行下面的命令生成Heap Dump:java

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

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

使用 JConsole 生成

JConsole是JDK提供的一個基於GUI查看JVM系統信息的工具,既能夠管理本地的JVM,也能夠管理遠程的JVM,能夠經過下圖的 dumpHeap 按鈕生成 Heap Dump文件。
eclipse

在JVM中增長參數生成

在JVM的配置參數中能夠添加 -XX:+HeapDumpOnOutOfMemoryError 參數,當應用拋出 OutOfMemoryError 時自動生成dump文件;
在JVM的配置參數中添加 -Xrunhprof:head=site 參數,會生成java.hprof.txt 文件,不過這樣會影響JVM的運行效率,不建議在生產環境中使用(未親測)。工具

常見的Heap Dump文件分析工具

JVM Heap Dump文件可使用經常使用的分析工具以下:spa

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.unix

這個時候訪問 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工具的功能列表,下一篇文章將要經過實例詳細進行分析。

相關文章
相關標籤/搜索