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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章