1. Heap統(tǒng)計信息
- 打印heap信息诈嘿,如新老代大小均牢,使用率糠雨。
jmap -heap <PID>
2. 對象統(tǒng)計信息
- 打印所有heap對象的統(tǒng)計信息,如對象的個數(shù)與所占大小徘跪。
// 打印所有對象的信息
jmap -histo PID > /tmp/histo.log
// 僅打印存活對象的信息
jmap -histo:live PID > /tmp/histo-live.log
不要隨便加 -F 參數(shù)甘邀,可能把進程搞崩潰琅攘,僅當JVM已經(jīng)假死狀態(tài),才用-F最后一搏松邪。live參數(shù)實際效果是先執(zhí)行一次Full GC清理掉已經(jīng)過期的對象坞琴,因此要注意對線上業(yè)務(wù)的超時影響,盡量摘流量執(zhí)行测摔。
- 打印各個分代中的對象統(tǒng)計信息置济,見TBJMap
3. 獲取HeapDump
// 獲取所有對象的dump
jmap -dump:format=b,file=/tmp/heap.hprof <PID>
// 獲取存活對象的dump解恰,實際效果是先執(zhí)行一次FULL GC
jmap -dump:live,format=b,file=/tmp/heap-live.hprof <PID>
heap dump會造成JVM比較長時間的停頓锋八,必須摘流量執(zhí)行
dump文件一定要zip后再傳輸,節(jié)約不少時間
tar -zcf /tmp/heap.hprof.gz /tmp/heap.hprof
4. 分析HeapDump
使用JDK自帶的VisaulVM(以jvisualvm啟動)或Eclipse的MAT均可
留意對象有兩個大小护盈,很多時候Retained Size
更有意義:
- 本身大小(Shallow Size):對象本來的大小豆挽。
- 保留大小(Retained Size): 當前對象大小 + 當前對象直接或間接引用到的對象的大小總和闸拿。
注意,Eclipse MAT分析時,如果想看到非存活狀態(tài)的對象温学,需要特別勾選。
5. 分析HeapDump進階
使用OQL進行高級查詢芝雪。
6. Out Of Memory時自動HeapDump
OOM時生成HeapDump文件.
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${LOGDIR}/