天天看點

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont

對于大型服務端應用程式來說,有些記憶體洩露問題很難在測試階段發現,此時就需要分析JVM Heap Dump檔案來找出問題。随着單機記憶體越來越大,應用heap也開得越來越大,動辄十幾G的Dump也不足為奇了。要快速分析,快速定位問題就必須有給力的工具幫忙,下面我來介紹下常用記憶體分析工具。記憶體分析工具 jmap JDK自帶的一個工具,是JVM Heap導出的必備工具。 jmap -dump:format=b,file=xxx.bin pid   pid是java程式pid 此指令會将虛拟機heap鏡像導成檔案。不過jmap也有直接分析功能:jmap –histo pid,如下圖。優點是可以直接檢視對象的大小和類型,缺點是無法檢視詳細的對象引用資訊。

Step 2:進入mat所在目錄,編輯MemoryAnalyzer.ini檔案設定最大記憶體值比如-Xmx9g。

Step 3:執行./ParseHeapDump.sh xxxx.bin 來分析dump檔案,MAT的分析速度還是很快的。最終得到以下檔案。

Step 4:将分析得到的檔案包括原dump檔案下載下傳回windows平台,打開eclipse插件使用菜單File-->Open Heap Dump打開dump檔案即可檢視到分析結果。 MAT中我們最常用的是Dominator Tree(List the biggest objects and what they keep alive.)功能來分析較大的objects以及他們之間的引用關系,确定一些對象為什麼不會被gc。比如從下面兩張圖中就可以看出,在兩個前後兩次的dump檔案中HConnectionManager$HConnectionImplementation對象越來越大,這裡就有OOM的風險。

繼續閱讀