1. 程式人生 > >匯出記憶體映象檔案與記憶體異常分析(MAT工具)

匯出記憶體映象檔案與記憶體異常分析(MAT工具)

記憶體溢位自動匯出引數:

//發生溢位時dump出來 
-XX:+HeapDumpOnOutOfMemoryError
//dump的路徑 ./為專案啟動根路徑 
-XX:HeapDumpPath=./

記憶體溢位手動匯出引數:jmap命令使用

jdk安裝後會自帶一些小工具,jmap命令(Java Memory Map)是其中之一。主要用於列印指定Java程序(或核心檔案、遠端除錯伺服器)的共享物件記憶體對映或堆記憶體細節。

jmap命令可以獲得執行中的jvm的堆的快照,從而可以離線分析堆,以檢查記憶體洩漏,檢查一些嚴重影響效能的大物件的建立,檢查系統中什麼物件最多,各種物件所佔記憶體的大小等等。可以使用jmap生成Heap Dump。

關於jamp的命令jdk的官方上很詳細,不贅述了。

注意:jmap的dump 將記憶體使用的詳細情況輸出到檔案

jmap -dump:live,format=b,file=a.log pid //說明:記憶體資訊dump到a.log檔案中

這個命令執行,JVM會將整個heap的資訊dump寫入到一個檔案,heap如果比較大的話,就會導致這個過程比較耗時,並且執行的過程中為了保證dump的資訊是可靠的,所以會暫停應用

通常做法是:

1)首先配置JVM啟動引數,讓JVM在遇到OutOfMemoryError時自動生成Dump檔案

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path

2)然後使用命令

jmap  -dump:format=b,file=/path/heap.bin 程序ID  

如果只dump heap中的存活物件,則加上選項-live。 

 3)然後使用MAT分析工具,如jhat命令,eclipse的mat外掛

最後在eclipse中安裝MAT外掛(http://www.eclipse.org/mat/),
然後在eclipse中,file---->open,開啟這個檔案heap.bin,利用現成的OOM工具進行分析。
具體操作方法:
首先輸入網址http://www.eclipse.org/mat/previousReleases.php,然後檢視你自己的Eclipse版本,
我的是Indigo的,
所以點選連結“Previous Releases”,選擇Indigo版本的URLhttp://download.eclipse.org/mat/1.1.0/update-site/ 

 用jhat命令可以參看 jhat -port 5000 heapDump 在瀏覽器中訪問:http://localhost:5000/ 檢視詳細資訊