jmap概述
jmap工具提供了一系列有用的選項來查看堆的使用情況和新生代、老年代中對象的情況。
通過制定 -heap選項和運行java應用的jvm進程的pid(獲取java應用的pid,可以使用
jps工具。),就能輸出響應進程的新生代和老年代的情況。
使用jmap輸出堆的信息
C:\Users\JavaMaster>jmap -heap 14584
jmap -heap 14584
Attaching to process ID 14584, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.112-b15
using thread-local object allocation.
Parallel GC with 4 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 2644508672 (2522.0MB)
NewSize = 55050240 (52.5MB)
MaxNewSize = 881328128 (840.5MB)
OldSize = 110624768 (105.5MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 418906112 (399.5MB)
used = 221504400 (211.24305725097656MB)
free = 197401712 (188.25694274902344MB)
52.876860388229424% used
From Space:
capacity = 524288 (0.5MB)
used = 0 (0.0MB)
free = 524288 (0.5MB)
0.0% used
To Space:
capacity = 8912896 (8.5MB)
used = 0 (0.0MB)
free = 8912896 (8.5MB)
0.0% used
PS Old Generation
capacity = 112197632 (107.0MB)
used = 19927224 (19.00408172607422MB)
free = 92270408 (87.99591827392578MB)
17.76082404306002% used
21104 interned Strings occupying 2539648 bytes.
輸出的主要信息:
* 堆的最小容量,最大容量
* eden區與survivor區的比值
* eden區的容量,使用的大小,未使用的區域的大小,使用的區域的比例
* 兩個survivor區的容量,使用的大小,未使用的區域的大小,使用的區域的比例
* 老年代的容量,使用的大小,未使用的區域的大小,使用的區域的比例
使用jmap輸出對象信息
C:\Users\JavaMaster>jmap -histo 14584
num #instances #bytes class name
----------------------------------------------
1: 1664214 51285312 [Ljava.lang.Object;
2: 33534 37954152 [I
3: 318400 35074672 [C
4: 723026 28921040 java.util.TreeMap$Entry
5: 704904 22556928 java.io.ObjectStreamClass$WeakClassKey
6: 55489 11788280 [B
7: 220526 5292624 java.lang.Long
8: 163309 3919416 java.lang.String
9: 81638 3918624 java.util.TreeMap
10: 98050 3137600 java.util.TreeMap$KeyIterator
11: 31114 2986944 java.lang.management.ThreadInfo
12: 88277 2118648 java.io.SerialCallbackContext
13: 80792 1939008 javax.management.openmbean.CompositeDataSupport
14: 93970 1868624 [Ljavax.management.openmbean.CompositeData;
15: 16715 1738360 java.io.ObjectStreamClass
16: 92098 1473568 java.lang.Boolean
17: 58928 1414272 java.lang.StringBuilder
18: 81599 1305584 java.util.TreeMap$KeySet
19: 79467 1271472 java.util.TreeMap$EntrySet
20: 23527 1129296 java.util.HashMap
21: 29858 955456 java.lang.StackTraceElement
22: 7805 886672 java.lang.Class
23: 26892 860544 java.util.HashMap$Node
24: 51123 817968 java.lang.Integer
25: 9149 805112 java.lang.reflect.Method
26: 10889 748992 [Ljava.util.HashMap$Node;
27: 31117 736736 [Ljava.lang.StackTraceElement;
28: 16713 668520 java.util.HashMap$KeyIterator
29: 15965 609712 [Ljava.lang.String;
30: 16824 538368 java.util.concurrent.ConcurrentHashMap$Node
31: 1361 530584 [J
32: 7954 445424 java.util.concurrent.ConcurrentHashMap$KeyIterator
33: 18468 443232 java.lang.management.LockInfo
34: 9846 339240 [Ljavax.management.ObjectName$Property;
35: 8391 335640 java.io.ObjectStreamClass$FieldReflectorKey
36: 10407 333024 java.io.DataOutputStream
37: 5084 314944 [Ljava.io.ObjectInputStream$HandleTable$HandleList;
可以加給-histo加上live選項,只輸出存活的對象
jmap -histo:live pid
輸出的信息中帶方括號的符號是java類型在jvm的表示式:
[C 等價於 char[]
[S 等價於 short[]
[I 等價於 int[]
[B 等價於 byte[]
[[I 等價於 int[][]
上面的輸出中[C對象佔用Heap這麼多,往往跟String有關,String其內部使用
final char[]數組來保存數據的。
constMethodKlass/ methodKlass/ constantPoolKlass/ constantPoolCacheKlass/ instanceKlassKlass/ methodDataKlass
與Classloader相關,常駐與Perm區。