使用jmap查看堆和对象的信息

来源:互联网 发布:网络机顶盒好看的软件 编辑:程序博客网 时间:2024/06/02 04:32

jmap概述

jmap工具提供了一系列有用的选项来查看堆的使用情况和新生代、老年代中对象的情况。
通过制定 -heap选项和运行java应用的jvm进程的pid(获取java应用的pid,可以使用
jps工具。),就能输出响应进程的新生代和老年代的情况。

使用jmap输出堆的信息

C:\Users\JavaMaster>jmap -heap 14584jmap -heap 14584Attaching to process ID 14584, please wait...Debugger attached successfully.Server compiler detected.JVM version is 25.112-b15using 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 GenerationEden Space:   capacity = 418906112 (399.5MB)   used     = 221504400 (211.24305725097656MB)   free     = 197401712 (188.25694274902344MB)   52.876860388229424% usedFrom Space:   capacity = 524288 (0.5MB)   used     = 0 (0.0MB)   free     = 524288 (0.5MB)   0.0% usedTo Space:   capacity = 8912896 (8.5MB)   used     = 0 (0.0MB)   free     = 8912896 (8.5MB)   0.0% usedPS Old Generation   capacity = 112197632 (107.0MB)   used     = 19927224 (19.00408172607422MB)   free     = 92270408 (87.99591827392578MB)   17.76082404306002% used21104 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区。