jmap(Memory Map for Java)命令用来生成堆转储快照。
jmap的作用并不仅仅是为了生成堆转储快照文件,还可以查看finalize执行队列、Java堆和方法区的详细信息,比如空间使用率、当前使用的什么垃圾回收器、分代情况等等。
Java内存映像工具jmap
语法
jmap [ option ] vmid
option选项
选项 | 作用 |
---|---|
-dump | 生成java堆转储快照,格式为jmap -dump:[live,]format=b,file= |
-finalizerinfo | 显示在F-Queue中等待Finalizer线程执行finalize方法的对象。 |
-heap | 显示Java堆详细信息,如使用了那种回收器、参数配置、分代状况等。 |
-histo | 显示堆中对象统计信息,包括类、实例数量、合计容器 |
-permstat | 以ClassLoader为统计口径显示永久代内存状态 |
-F | 当虚拟机进程对-dump选项没有响应时,可使用这个选项强制生成dump快照 |
使用
jmap命令的可选参数。如果没有指定这个参数,jinfo命令会显示Java虚拟机进程的内存映像信息,如下图:
work@authority-web-v1-78f4d45f98-zpnx6:~$ jps
854586 Jps
47 authority-web.jar
work@authority-web-v1-78f4d45f98-zpnx6:~$ jmap 47
Attaching to process ID 47, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.222-b10
0x0000000000400000 8K /usr/local/openjdk-8/bin/java
0x00007fb7079e3000 82K /lib/x86_64-linux-gnu/libresolv-2.24.so
0x00007fb707bfa000 22K /lib/x86_64-linux-gnu/libnss_dns-2.24.so
0x00007fb74049a000 90K /lib/x86_64-linux-gnu/libgcc_s.so.1
0x00007fb7406b1000 260K /usr/local/openjdk-8/jre/lib/amd64/libsunec.so
0x00007fb76c7ca000 92K /usr/local/openjdk-8/jre/lib/amd64/libnio.so
0x00007fb76c9dc000 51K /usr/local/openjdk-8/jre/lib/amd64/libmanagement.so
0x00007fb76cbe6000 114K /usr/local/openjdk-8/jre/lib/amd64/libnet.so
0x00007fb781dd5000 123K /usr/local/openjdk-8/jre/lib/amd64/libzip.so
0x00007fb781ff1000 46K /lib/x86_64-linux-gnu/libnss_files-2.24.so
0x00007fb782203000 46K /lib/x86_64-linux-gnu/libnss_nis-2.24.so
0x00007fb78240f000 86K /lib/x86_64-linux-gnu/libnsl-2.24.so
0x00007fb782627000 30K /lib/x86_64-linux-gnu/libnss_compat-2.24.so
0x00007fb78282f000 50K /usr/local/openjdk-8/jre/lib/amd64/libinstrument.so
0x00007fb782a3a000 202K /usr/local/openjdk-8/jre/lib/amd64/libjava.so
0x00007fb782c64000 68K /usr/local/openjdk-8/jre/lib/amd64/libverify.so
0x00007fb782e74000 31K /lib/x86_64-linux-gnu/librt-2.24.so
0x00007fb78307c000 1038K /lib/x86_64-linux-gnu/libm-2.24.so
0x00007fb783380000 15953K /usr/local/openjdk-8/jre/lib/amd64/server/libjvm.so
0x00007fb7842e7000 1649K /lib/x86_64-linux-gnu/libc-2.24.so
0x00007fb784686000 14K /lib/x86_64-linux-gnu/libdl-2.24.so
0x00007fb78488a000 334K /usr/local/openjdk-8/lib/amd64/jli/libjli.so
0x00007fb784aa1000 132K /lib/x86_64-linux-gnu/libpthread-2.24.so
0x00007fb784cbe000 149K /lib/x86_64-linux-gnu/ld-2.24.so
work@authority-web-v1-78f4d45f98-zpnx6:~$
work@authority-web-v1-78f4d45f98-zpnx6:~$
-heap
显示Java堆的如下信息:
work@authority-web-v1-78f4d45f98-zpnx6:~$ ^C
work@authority-web-v1-78f4d45f98-zpnx6:~$ jmap -heap 47
Attaching to process ID 47, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.222-b10
using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 161480704 (154.0MB)
NewSize = 53084160 (50.625MB)
MaxNewSize = 53084160 (50.625MB)
OldSize = 108396544 (103.375MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
New Generation (Eden + 1 Survivor Space):
capacity = 47775744 (45.5625MB)
used = 14542552 (13.868858337402344MB)
free = 33233192 (31.693641662597656MB)
30.439195253557955% used
Eden Space:
capacity = 42467328 (40.5MB)
used = 14496264 (13.824714660644531MB)
free = 27971064 (26.67528533935547MB)
34.135097927517364% used
From Space:
capacity = 5308416 (5.0625MB)
used = 46288 (0.0441436767578125MB)
free = 5262128 (5.0183563232421875MB)
0.8719738618827161% used
To Space:
capacity = 5308416 (5.0625MB)
used = 0 (0.0MB)
free = 5308416 (5.0625MB)
0.0% used
concurrent mark-sweep generation:
capacity = 108396544 (103.375MB)
used = 69763232 (66.53140258789062MB)
free = 38633312 (36.843597412109375MB)
64.35927698949516% used
38279 interned Strings occupying 4296008 bytes.
work@authority-web-v1-78f4d45f98-zpnx6:~$
-histo[:live]
显示Java堆中对象的统计信息,包括:对象数量、占用内存大小(单位:字节)和类的完全限定名
work@authority-web-v1-78f4d45f98-zpnx6:~$ jmap -histo 47
num #instances #bytes class name
----------------------------------------------
1: 203570 17317376 [C
2: 8015 8330368 [I
3: 11785 5102672 [B
4: 200710 4817040 java.lang.String
5: 54046 4756048 java.lang.reflect.Method
6: 52052 3601488 [Ljava.util.Hashtable$Entry;
7: 51912 2491776 java.util.Hashtable
8: 69610 2227520 java.util.concurrent.ConcurrentHashMap$Node
9: 42359 1694360 java.util.LinkedHashMap$Entry
10: 14754 1648040 java.lang.Class
11: 46595 1491040 java.util.Hashtable$Entry
12: 24749 1364792 [Ljava.lang.Object;
13: 16400 1307848 [Ljava.util.HashMap$Node;
14: 51139 1227336 net.sourceforge.pinyin4j.multipinyin.Trie
15: 35509 1136288 java.util.HashMap$Node
16: 18233 1021048 java.util.LinkedHashMap
17: 43037 938448 [Ljava.lang.Class;
18: 652 728768 [Ljava.util.concurrent.ConcurrentHashMap$Node;
19: 9540 686880 java.lang.reflect.Field
20: 18791 450984 java.util.ArrayList
work@authority-web-v1-78f4d45f98-zpnx6:~$ jmap -histo:live 47
num #instances #bytes class name
----------------------------------------------
1: 187827 15633816 [C
2: 186246 4469904 java.lang.String
3: 51818 3547824 [Ljava.util.Hashtable$Entry;
4: 37131 3267528 java.lang.reflect.Method
5: 51730 2483040 java.util.Hashtable
6: 68132 2180224 java.util.concurrent.ConcurrentHashMap$Node
7: 7198 1953120 [B
8: 14565 1628384 java.lang.Class
9: 38624 1544960 java.util.LinkedHashMap$Entry
10: 41707 1334624 java.util.Hashtable$Entry
11: 6902 1276800 [I
12: 21838 1237912 [Ljava.lang.Object;
13: 51139 1227336 net.sourceforge.pinyin4j.multipinyin.Trie
14: 14954 1096368 [Ljava.util.HashMap$Node;
15: 17222 964432 java.util.LinkedHashMap
16: 25508 816256 java.util.HashMap$Node
17: 558 704480 [Ljava.util.concurrent.ConcurrentHashMap$Node;
18: 22133 485168 [Ljava.lang.Class;
19: 25426 406816 java.lang.Object
20: 16800 403200 java.util.ArrayList
生成Java虚拟机的堆转储快照dump文件
live
参数是可选的,如果指定,则只转储堆中的活动对象;如果没有指定,则转储堆中的所有对象。format=b
表示以hprof二进制格式转储Java堆的内存。file=<filename>
用于指定快照dump文件的文件名。
work@authority-web-v1-78f4d45f98-zpnx6:~$ jmap -dump:live,format=b,file=/home/work/dump 47
Dumping heap to /home/work/dump ...
Heap dump file created
work@authority-web-v1-78f4d45f98-zpnx6:~$
-clstats 显示Java堆中元空间的类加载器的统计信息
-F 强制模式。如果指定的pid没有响应,可以配合
-dump
或-histo
一起使用。此模式下,不支持live参数。
引用