前面通過jstat可以對JVM對的內存進行統計分析,而jmap可以獲取到更加詳細的內容,如:內存使用情況的匯總,對內存溢出的定位與分析。
查看內存使用情況
使用命令【jmap -heap 進程號】
Attaching to process ID 17656, please wait... Debugger attached successfully. Client compiler detected. JVM version is 25.73-b02 using thread-local object allocation. Mark Sweep Compact GC Heap Configuration: MinHeapFreeRatio = 40 MaxHeapFreeRatio = 70 MaxHeapSize = 268435456 (256.0MB) NewSize = 5570560 (5.3125MB) MaxNewSize = 89456640 (85.3125MB) OldSize = 11206656 (10.6875MB) NewRatio = 2 SurvivorRatio = 8 MetaspaceSize = 12582912 (12.0MB) CompressedClassSpaceSize = 1073741824 (1024.0MB) MaxMetaspaceSize = 4294901760 (4095.9375MB) G1HeapRegionSize = 0 (0.0MB) Heap Usage: New Generation (Eden + 1 Survivor Space): capacity = 8847360 (8.4375MB) used = 3589544 (3.4232559204101562MB) free = 5257816 (5.014244079589844MB) 40.571922019675924% used Eden Space: capacity = 7929856 (7.5625MB) used = 2672040 (2.5482559204101562MB) free = 5257816 (5.014244079589844MB) 33.69594605501033% used From Space: capacity = 917504 (0.875MB) used = 917504 (0.875MB) free = 0 (0.0MB) 100.0% used To Space: capacity = 917504 (0.875MB) used = 0 (0.0MB) free = 917504 (0.875MB) 0.0% used tenured generation: capacity = 19415040 (18.515625MB) used = 12128424 (11.566566467285156MB) free = 7286616 (6.949058532714844MB) 62.46921973892405% used 12283 interned Strings occupying 1576968 bytes.
查看內存中對象數量及大小
使用命令【jmap -histo:live 進程號 | more】查看活躍對象
使用命令【jmap -histo 進程號 | more】查看所有對象
num #instances #bytes class name ---------------------------------------------- 1: 29051 5802816 [C 2: 3618 1045824 [I 3: 27608 441728 java.lang.String 4: 779 386792 [B 5: 3229 316624 java.lang.Class 6: 3394 298672 java.lang.reflect.Method 7: 9984 239616 java.util.HashMap$Node 8: 3370 201096 [Ljava.lang.Object; 9: 757 119992 [Ljava.util.HashMap$Node; 10: 3047 73128 java.util.concurrent.ConcurrentHashMap$Node 11: 820 66880 [Ljava.lang.String; 12: 1057 42280 java.util.HashMap 13: 568 40896 java.lang.reflect.Constructor 14: 2207 38952 [Ljava.lang.Class; 15: 1572 37728 java.util.Hashtable$Entry 16: 1109 35488 java.util.LinkedHashMap$Entry 17: 1084 34688 java.util.TreeMap$Entry 18: 855 34200 org.apache.tomcat.util.modeler.AttributeInfo 19: 133 33672 [[C 20: 859 27488 java.lang.ref.SoftReference 21: 47 23568 [Ljava.util.concurrent.ConcurrentHashMap$Node; 22: 2529 20232 java.lang.Object 23: 594 19008 javax.management.MBeanAttributeInfo 24: 108 17608 [Ljava.util.Hashtable$Entry; 25: 710 17040 java.util.ArrayList 26: 565 13560 com.sun.org.apache.xerces.internal.xni.QName
查看內存中對象數量及大小
#查看所有對象,包括活躍以及非活躍的 jmap ‐histo <pid> | more
#查看活躍對象 jmap ‐histo:live <pid> | more
#查看活躍對象 jmap -histo:live 29720 | more
對象說明:
B byte
C char
D double
F float
I int
J long
Z boolean
[ 數組,如[I表示int[]
[L+類名 其他對象
將內存使用情況dump到文件中
有些時候我們需要將jvm當前內存中的情況dump到文件中,然后對它進行分析,jmap也是支持dump到文件中的。
#用法: jmap -dump:format=b,file=dumpFileName <pid> jmap -dump:format=b,file=../tmp/dump.dat 29720
通過jhat對dump文件進行分析
#用法: jhat -port <port> <file> jhat -port 29729 ../tmp/dump.dat
打開瀏覽器訪問http://localhost:8999/
在最后面有OQL查詢功能:
點擊下面選項
進入頁面,輸入下面語句查詢字符串大於10000,點擊Execute按鈕,查詢結果:
select s from java.lang.String s where s.value.length >= 10000
進入如下頁面
通過MAT工具對dump文件進行分析
MAI工具介紹
MAT(Memory Analyzer Tool),一個基於Eclipse的內存分析工具,是一個快速、功能豐富的JAVA heap分析工具,它可以幫助我們查找內存泄漏和減少內存消耗。使用內存分析工具從眾多的對象中進行分析,快速的計算出在內存中對象的占用大小,看看是誰阻止了垃圾收集器的回收工作,並可以通過報表直觀的查看到可能造成這種結果的對象。
下載安裝
下載地址:https://www.eclipse.org/mat/downloads.php
解壓后得到的文件
使用
雙擊啟動 MemoryAnalyzer.exe應用程序
Actions說明:
Histogram:列出內存中的對象,對象的個數以及大小
Dominator Tree:列出最大的對象以及其依賴存活的對象