常用Heap分析

1. Heap統計信息

  • 打印heap信息,如新老代大小,使用率。
jmap -heap <PID>

2. 對象統計信息

  • 打印所有heap對象的統計信息,如對象的個數與所占大小。
// 打印所有對象的信息
jmap -histo PID > /tmp/histo.log

// 僅打印存活對象的信息
jmap -histo:live PID > /tmp/histo-live.log

不要隨便加 -F 參數,可能把進程搞崩潰,僅當JVM已經假死狀態,才用-F最后一搏。live參數實際效果是先執行一次Full GC清理掉已經過期的對象,因此要注意對線上業務的超時影響,盡量摘流量執行。

  • 打印各個分代中的對象統計信息,見TBJMap

3. 獲取HeapDump

// 獲取所有對象的dump
jmap -dump:format=b,file=/tmp/heap.hprof <PID>

// 獲取存活對象的dump,實際效果是先執行一次FULL GC
jmap -dump:live,format=b,file=/tmp/heap-live.hprof <PID>

heap dump會造成JVM比較長時間的停頓,必須摘流量執行

dump文件一定要zip后再傳輸,節約不少時間

tar -zcf /tmp/heap.hprof.gz /tmp/heap.hprof

4. 分析HeapDump

使用JDK自帶的VisaulVM(以jvisualvm啟動)或Eclipse的MAT均可

留意對象有兩個大小,很多時候Retained Size更有意義:

  • 本身大小(Shallow Size):對象本來的大小。
  • 保留大小(Retained Size): 當前對象大小 + 當前對象直接或間接引用到的對象的大小總和。

注意,Eclipse MAT分析時,如果想看到非存活狀態的對象,需要特別勾選。

5. 分析HeapDump進階

使用OQL進行高級查詢。

6. Out Of Memory時自動HeapDump

OOM時生成HeapDump文件.

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${LOGDIR}/
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容