java 記憶體爆滿排查命令
1. top 一下獲取記憶體佔用率最高的pid。
2. 轉到 jdk的bin目錄,執行jdk命令。
(1)./jmap -heap pid 檢視JVM空間總體使用情況
(2)./jmap -histo pid |more 檢視類的例項數和記憶體量
(3)./jmap -histo:live pid |more 檢視所有活著的例項數量。
(4)./jmap -dump:format=b,file=dump_tomcat.dat pid將記憶體使用情況dump到檔案中
3.使用MAT工具對dump檔案進行分析。
下載MAT(Memory Analyzer Tool),一個基於Eclipse的記憶體分析工具,是一個快速、功能豐
富的JAVA heap分析工具,它可以幫助我們查詢記憶體洩漏和減少記憶體消耗。
下載地址:http://www.eclipse.org/mat/downloads.php
然後解壓,跟eclipse一樣,我們直接啟動就可以了,啟動介面如下,我們點選左上角“file”或者紅框中的“Open a Heap Dump”就可以開啟我們的Dump檔案。
Dump檔案字尾問題,找不到Dump檔案時選擇All file,就可以看到了
2. 選擇Leak Suspects Report(洩露嫌疑報告),進入到主介面
3. 看到主介面,Problem區域就是提示可能有問題的類的資訊了,我們可以看到,有一個類的例項佔了700M左右,佔用了記憶體總量90%以上了,點選Details可以檢視詳情,點選See stacktrace可以檢視跟蹤堆疊找到問題程式碼所在位置。
4. 下圖可以看出來這個物件佔用了很多的記憶體
當然我們也可以切換檢視,檢視具體物件的一些資訊,可以看到這個class生成了133w個例項,肯定是程式碼出問題了
跟蹤程式碼,定位洩露位置
點選See stacktrace,下圖是跟蹤的程式碼位置,可以清晰的看到是第幾行生成的物件,進而分析程式碼