jmap命令能夠獲取運行中的jvm的快照,從而離線分析,檢查內存泄漏,檢查一些嚴重影響性能的大對象的建立,檢查系統中最多的對象,各類對象所佔用的內存大小.可使用jmap生成Heap 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
垃圾收集器
當-Xmx 和-Xms 相等時MinHeapFreeRatio和MaxHeapFreeRatio 兩個參數無效。
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