java 之 jmap
jmap是一个多功能的命令。它可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。
1、jmap的用法
可以使用jmap --help
命令查看jmap的具体用法。
参数列表:
1. option: 选项参数。
2. pid: 需要打印配置信息的进程ID。
3. executable: 产生核心dump的Java可执行文件。
4. core: 需要打印配置信息的核心文件。
5. server-id 可选的唯一id,如果相同的远程主机上运行了多台调试服务器,用此选项参数标识服务器。
6. remote server IP or hostname 远程调试服务器的IP地址或主机名。
options:
1. no option: 查看进程的内存映像信息,类似 Solaris pmap 命令。
2. heap: 显示Java堆详细信息
3. histo[:live]:显示堆中对象的统计信息
4. clstats:打印类加载器信息
5. finalizerinfo:显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
6. dump:<dump-options>:生成堆转储快照
7. F:当-dump没有响应时,使用-dump或者-histo参数. 在这个模式下,live子参数无效.
8. help:打印帮助信息
9. J<flag>:指定传递给运行jmap的JVM的参数
2、实际测试
2.1、jmap pid
查看进程的内存映像信息,会打印目标中加载的每个对象的其实地址,映射大小和共享对象文件的路径全程。
jmap 7176
Attaching to process ID 7176, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.181-b13
0x0000000062cd0000 144K E:\program files\Java\jdk1.8\jre\bin\sunec.dll
0x0000000062d00000 68K E:\program files\Java\jdk1.8\jre\bin\nio.dll
0x0000000062d20000 104K E:\program files\Java\jdk1.8\jre\bin\net.dll
0x0000000062e20000 52K E:\program files\Java\jdk1.8\jre\bin\management.dll
0x0000000062e30000 140K E:\program files\Java\jdk1.8\jre\bin\instrument.dll
0x0000000062e60000 88K E:\program files\Java\jdk1.8\jre\bin\zip.dll
0x0000000062e80000 8840K E:\program files\Java\jdk1.8\jre\bin\server\jvm.dll
0x0000000063730000 840K E:\program files\Java\jdk1.8\jre\bin\msvcr100.dll
0x0000000066670000 164K E:\program files\Java\jdk1.8\jre\bin\java.dll
0x00000000666a0000 60K E:\program files\Java\jdk1.8\jre\bin\verify.dll
0x00007ff6e81f0000 220K E:\program files\Java\jdk1.8\bin\java.exe
0x00007ffb555b0000 84K C:\Windows\system32\wshbth.dll
0x00007ffb555d0000 56K C:\Windows\System32\winrnr.dll
....
2.2、jmap -heap pid
描述的java堆的详细信息,打印出来一个堆的信息,包括使用的GC算法,堆的配置信息和各个内存区域内存的使用情况。
jmap -heap 7176
Attaching to process ID 7176, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.181-b13
using thread-local object allocation.
Parallel GC with 4 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 2126512128 (2028.0MB)
NewSize = 44564480 (42.5MB)
MaxNewSize = 708837376 (676.0MB)
OldSize = 89653248 (85.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 = 202899456 (193.5MB)
used = 136544264 (130.21875762939453MB)
free = 66355192 (63.28124237060547MB)
67.29651557074652% used
From Space:
capacity = 13107200 (12.5MB)
used = 10945880 (10.438804626464844MB)
free = 2161320 (2.0611953735351562MB)
83.51043701171875% used
To Space:
capacity = 13631488 (13.0MB)
used = 0 (0.0MB)
free = 13631488 (13.0MB)
0.0% used
PS Old Generation
capacity = 80216064 (76.5MB)
used = 16148768 (15.400665283203125MB)
free = 64067296 (61.099334716796875MB)
20.13158860549428% used
22086 interned Strings occupying 2226680 bytes.
2.3、jmap -histo:live pid
显示堆中对象的统计信息,会包括每一个java类,对象的数量,内存使用大小,类名称,如果是live 则是只计算活动的对象。
jmap -histo:live 7176
num #instances #bytes class name
----------------------------------------------
1: 60998 5874368 [C
2: 17062 1501456 java.lang.reflect.Method
3: 60470 1451280 java.lang.String
4: 32932 1053824 java.util.concurrent.ConcurrentHashMap$Node
5: 9450 1046824 java.lang.Class
6: 5209 694704 [B
7: 15962 638480 java.util.LinkedHashMap$Entry
8: 10791 576208 [Ljava.lang.Object;
9: 7123 544528 [Ljava.util.HashMap$Node;
10: 7750 434000 java.util.LinkedHashMap
11: 12088 386816 java.util.HashMap$Node
12: 17498 386232 [Ljava.lang.Class;
13: 4475 309792 [I
...
2.4、jmap -clstats pid
打印类的加载器信息。具体会打印出java堆内存的永久保存区域的类加载器的智能统计信息,包括名称,活跃度,地址,父类加载器,加载的类的数量和大小都会被打印。
jmap -clstats 7176
Attaching to process ID 7176, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.181-b13
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> 2717 4725508 null live <internal>
0x0000000082715770 1 1473 null dead sun/reflect/DelegatingClassLoader@0x000000010000a028
0x00000000825b9658 1 1471 null dead sun/reflect/DelegatingClassLoader@0x000000010000a028
0x0000000081648c60 1 1471 null dead sun/reflect/DelegatingClassLoader@0x000000010000a028
0x0000000081649f60 1 1471 null dead sun/reflect/DelegatingClassLoader@0x000000010000a028
0x0000000081952a90 1 1472 0x00000000814688c8 dead sun/reflect/DelegatingClassLoader@0x000000010000a028
0x0000000081955b90 1 880 0x00000000814688c8 dead sun/reflect/DelegatingClassLoader@0x000000010000a028
0x000000008195e090 1 880 0x00000000814688c8 dead sun/reflect/DelegatingClassLoader@0x000000010000a028
0x0000000082715e78 1 880 0x00000000814688c8 dead sun/reflect/DelegatingClassLoader@0x000000010000a028
2.5、jmap -finalizerinfo pid
打印等待终结的对象信息。
jmap -finalizerinfo 7176
Attaching to process ID 7176, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.181-b13
Number of objects pending for finalization: 0
2.6、jmap -dump:format=b,file=heapdump.phrof pid
生成堆转储快照dump文件.
使用hprof二进制格式转储java堆到指定的filename的文件中,如果想要查看heap dump文件,可以使用jhat(java堆分析工具,eclipse也有)读取生成的文件。
注意:由于JVM会将整个heap的信息dump到一个文件中,过程会比较耗时,并且工具在执行过程中保证dump的信息是可靠地,会暂停应用,线上的系统要注意这个
jmap -dump:format=b,file=heapdump.phrof 7176
Dumping heap to C:\Users\Administrator.2A217VYDOCRZIDV\heapdump.phrof ...
Heap dump file created