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区。