jmap查詢JVM堆內存

jmap命令能夠獲取運行中的jvm的快照,從而離線分析,檢查內存泄漏,檢查一些嚴重影響性能的大對象的建立,檢查系統中最多的對象,各類對象所佔用的內存大小.可使用jmap生成Heap Dump.

什麼是堆Dump

堆Dump是反應Java堆使用狀況的內存鏡像,其中主要包含系統信息,虛擬機屬性,完整的線程Dump,全部類和對象的狀態等。通常,在內存不足,GC異常等狀況下,咱們就會懷疑內存泄漏,這個時候就能夠製做堆(Dump)來查詢具體狀況。

常見的內存錯誤

> outOfMemoryError 年老代內存不足。
> outOfMemoryError:PermGen Space 永久代內存不足。
> outOfMemoryError:GC overhead limit exceed 垃圾回收時間佔用系統運行時間的98%或以上。

jmap -heap pid

查看java堆信息
Attaching to process ID 18378, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.261-b12

using thread-local object allocation.
Parallel GC with 4 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0 # JVM最小空閒比率
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 4164943872 (3972.0MB)
   NewSize                  = 87031808 (83.0MB)
   MaxNewSize               = 1388314624 (1324.0MB)
   OldSize                  = 175112192 (167.0MB)
   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 = 1314914304 (1254.0MB)
   used     = 794405392 (757.6040191650391MB)
   free     = 520508912 (496.39598083496094MB)
   60.41499355383087% used
From Space:
   capacity = 36175872 (34.5MB)
   used     = 23758320 (22.657699584960938MB)
   free     = 12417552 (11.842300415039062MB)
   65.6744915506114% used
To Space:
   capacity = 37224448 (35.5MB)
   used     = 0 (0.0MB)
   free     = 37224448 (35.5MB)
   0.0% used
PS Old Generation
   capacity = 352321536 (336.0MB)
   used     = 206117376 (196.56884765625MB)
   free     = 146204160 (139.43115234375MB)
   58.502633231026785% used
使用了 Parallel GC垃圾收集器
  • MinHeapFreeRatio 參數用來設置堆空間最小空閒比例,默認值是 0。當堆空間的空閒內存小於這個數值時,JVM 便會擴展堆空間。
  • MaxHeapFreeRatio 參數用來設置堆空間最大空閒比例,默認值是 100。當堆空間的空閒內存大於這個數值時,便會壓縮堆空間,獲得一個較小的堆。
當-Xmx 和-Xms 相等時MinHeapFreeRatio和MaxHeapFreeRatio 兩個參數無效。
  • MaxHeapSize 最大堆內存3972MB
  • NewSize 新生代默認大小 83MB
  • MaxNewSize 新生代最大大小爲 1324MB
  • OldSize 老年代大小 167MB
  • NewRatio 新生代和老年代的大小比率 2
  • SurvivorRatio 年輕代中Eden和Survivor的比率 8
  • MetaspaceSize 元空間大小 20.796875MB
  • CompressedClassSpaceSize 若是開啓了-XX:+UseCompressedOops及-XX:+UseCompressedClassesPointers(默認是開啓),則UseCompressedOops會使用32-bit的offset來表明java object的引用,而UseCompressedClassPointers則使用32-bit的offset來表明64-bit進程中的class pointer;可使用CompressedClassSpaceSize來設置這塊的空間大小
  • MaxMetaspaceSize 最大元空間大小 1073741824
  • G1HeapRegionSize G1收集器啓用,一個Region的大小能夠經過參數-XX:G1HeapRegionSize設定,取值範圍從1M到32M,且是2的指數。

jmap pid

查看進程的內存映像信息,相似 Solaris pmap 命令

使用不帶選項參數的jmap打印共享對象映射,將會打印目標虛擬機中加載的每一個共享對象的起始地址、映射大小以及共享對象文件的路徑全稱。這與Solaris的pmap工具比較類似。java

[root@rumenz ~]# jmap 18378
Attaching to process ID 18378, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.261-b12
0x000056248b911000      8K      /usr/local/jdk1.8/bin/java
0x00007f35f8b2e000      487K    /usr/local/jdk1.8/jre/lib/amd64/libfontmanager.so
0x00007f35f8d91000      38K     /usr/local/jdk1.8/jre/lib/amd64/libawt_headless.so
0x00007f35f8f99000      741K    /usr/local/jdk1.8/jre/lib/amd64/libawt.so
0x00007f35f9669000      86K     /usr/lib64/libgcc_s-4.8.5-20150702.so.1
0x00007f35f987f000      276K    /usr/local/jdk1.8/jre/lib/amd64/libsunec.so
0x00007f36189ed000      110K    /usr/local/jdk1.8/jre/lib/amd64/libnet.so
0x00007f3618c04000      91K     /usr/local/jdk1.8/jre/lib/amd64/libnio.so
0x00007f361991f000      50K     /usr/local/jdk1.8/jre/lib/amd64/libmanagement.so
0x00007f363caee000      124K    /usr/local/jdk1.8/jre/lib/amd64/libzip.so
0x00007f363cd0a000      60K     /usr/lib64/libnss_files-2.17.so
0x00007f363cf1d000      226K    /usr/local/jdk1.8/jre/lib/amd64/libjava.so
0x00007f363d14c000      64K     /usr/local/jdk1.8/jre/lib/amd64/libverify.so
0x00007f363d35b000      42K     /usr/lib64/librt-2.17.so
0x00007f363d563000      1110K   /usr/lib64/libm-2.17.so
0x00007f363d865000      16698K  /usr/local/jdk1.8/jre/lib/amd64/server/libjvm.so
0x00007f363e85a000      2105K   /usr/lib64/libc-2.17.so
0x00007f363ec28000      18K     /usr/lib64/libdl-2.17.so
0x00007f363ee2c000      106K    /usr/local/jdk1.8/lib/amd64/jli/libjli.so
0x00007f363f044000      138K    /usr/lib64/libpthread-2.17.so
0x00007f363f260000      159K    /usr/lib64/ld-2.17.so

jmap -histo:live pid

堆中對象統計
其中包括每一個Java類、對象數量、內存大小(單位:字節)、徹底限定的類名。打印的虛擬機內部的類名稱將會帶有一個 *前綴。若是指定了live子選項,則只計算活動的對象。
[root@Server-i-b2l6uawirw ~]# jmap -histo:live 18378 | more

 num     #instances         #bytes  class name
----------------------------------------------
   1:        221097       19915168  [C
   2:        220601        5294424  java.lang.String
   3:         44932        3954016  java.lang.reflect.Method
   4:         67973        3769400  [Ljava.lang.Object;
   5:         98145        3140640  java.util.HashMap$Node
   6:        115945        2782680  java.util.concurrent.atomic.AtomicLong
   7:         19301        2126520  java.lang.Class
   8:         61752        1976064  java.util.concurrent.ConcurrentHashMap$Node
   9:         14120        1665080  [Ljava.util.HashMap$Node;
  10:          8997        1548592  [B
  11:         15452        1236160  com.google.common.cache.LocalCache$Segment
  12:         34289        1097248  java.util.Hashtable$Entry
  13:         37325         895800  java.util.ArrayList
  14:          2899         790728  [Z
  15:         49080         785280  java.lang.Object
  16:         19315         772600  com.google.common.cache.AbstractCache$SimpleStatsCounter
  17:         21096         675072  java.lang.ref.WeakReference
  18:         16237         649480  java.lang.ref.SoftReference
  19:         13368         641664  java.util.HashMap
  20:         15945         637800  java.util.LinkedHashMap$Entry
  21:           114         588392  [F
  22:         18238         583616  java.util.concurrent.locks.ReentrantLock$NonfairSync
  23:           486         533312  [Ljava.util.concurrent.ConcurrentHashMap$Node;
  24:         16521         528672  java.lang.ref.ReferenceQueue
  25:          6928         498816  java.lang.reflect.Field
  26:          3863         494464  com.google.common.cache.LocalCache
  27:          7680         491520  java.net.URL
  28:          5948         475840  java.lang.reflect.Constructor
  29:          8359         463928  [I
[B 表明 byte
[C 表明 char
[D 表明 double
[F 表明 float
[I 表明 int
[J 表明 long
[Z 表明 boolean

jmap -clstats pid

打印類加載信息
-clstats是-permstat的替代方案,在JDK8以前,-permstat用來打印類加載器的數據
打印Java堆內存的永久保存區域的類加載器的智能統計信息。對於每一個類加載器而言,它的名稱、活躍度、地址、父類加載器、它所加載的類的數量和大小都會被打印。此外,包含的字符串數量和大小也會被打印。
[root@rumenz ~]# jmap -clstats 18378
Attaching to process ID 18378, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.261-b12
finding class loader instances ..
done.
computing per loader stat ..done.
please wait.. computing liveness.liveness analysis may be inaccurate ...
class_loader    classes bytes   parent_loader   alive?  type

<bootstrap>     3365    5881890   null          live    <internal>
0x00000006cb8abb88      1       880     0x00000006c7c2a4c8      dead    sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006cafd0af0      1       878     0x00000006c8520248      dead    sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006c8600870      0       0       0x00000006c82362b8      dead    hudson/ClassicPluginStrategy$DependencyClassLoader@0x00000007c0275308
0x00000006c86a9878      81      74744   0x00000006c86a98e8      dead    hudson/ClassicPluginStrategy$AntClassLoader2@0x00000007c0274dc8
0x00000006ca739a60      1       880     0x00000006c7c2a4c8      dead    sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006cafceae8      1       880     0x00000006c7c2a4c8      dead    sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006cb541b40      1       880     0x00000006c7c2a4c8      dead    sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006cb75fb68      1       880     0x00000006c86b09b8      dead    sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006ca5f9a40      1       1474      null          dead    sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006cb07fb18      1       880     0x00000006c82bcba8      dead    sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006cb083b28      1       1474    0x00000006c7c2a4c8      dead    sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006c86ad848      8       8716    0x00000006c86ad8b8      dead    hudson/ClassicPluginStrategy$AntClassLoader2@0x00000007c0274dc8
0x00000006c8bde898      49      155511  0x00000006c8237a80      dead    com/google/inject/internal/BytecodeGen$BridgeClassLoader@0x00000007c05f9028

jmap -dump:format=b,file=dump.phrof pid

生成堆轉儲快照文件

這個命令執行,JVM會將整個heap的信息dump寫入到一個文件,heap若是比較大的話,就會致使這個過程比較耗時,而且執行的過程當中爲了保證dump的信息是可靠的,因此會暫停應用, 線上系統慎用。bootstrap

[root@rumenz ~]# jmap -dump:format=b,file=dump.hprof 18378
Dumping heap to /root/dump.hprof ...
Heap dump file created

相關文章
相關標籤/搜索