jmap命令

    打印可共享内存map或堆内存细节信息。使用时可能需要root权限。

概要

jmap [options] pid

jmap [options] executable core

jmap [options] [pid] [server-id@] remote-hostname-or-IP

options 命令行选项。

pid Java进程号。

executable 可执行命令。

core 需要打印内存信息的core文件。

remote-hostname-or-IP 多个调试服务器在同一个远程主机上运行时使用的可选唯一标识。

描述

    jmap主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节。如果进程运行在64位虚拟机上,则可能需要使用-J-d64选项。

Options

< no option > 如果使用不带选项参数的jmap打印共享对象映射,将会打印目标虚拟机中加载的每个共享对象的起始地址、映射大小以及共享对象文件的路径全称。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
-> % sudo jmap 3431
Attaching to process ID 3431, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.66-b17
0x0000000000400000 7K /home/lyyljs/lan/jdk8/bin/java
0x00007f95eee86000 48K /home/lyyljs/lan/jdk8/jre/lib/amd64/libmanagement.so
0x00007f95ef592000 86K /lib/x86_64-linux-gnu/libgcc_s.so.1
0x00007f95ef7a8000 250K /home/lyyljs/lan/jdk8/jre/lib/amd64/libsunec.so
0x00007f95efbef000 90K /home/lyyljs/lan/jdk8/jre/lib/amd64/libnio.so
0x00007f9611931000 113K /home/lyyljs/lan/jdk8/jre/lib/amd64/libnet.so
0x00007f96279cc000 121K /home/lyyljs/lan/jdk8/jre/lib/amd64/libzip.so
0x00007f9627be7000 50K /lib/x86_64-linux-gnu/libnss_files-2.15.so
0x00007f9627df4000 46K /lib/x86_64-linux-gnu/libnss_nis-2.15.so
0x00007f962c0ce000 94K /lib/x86_64-linux-gnu/libnsl-2.15.so
0x00007f962c2e8000 34K /lib/x86_64-linux-gnu/libnss_compat-2.15.so
0x00007f962c4f1000 220K /home/lyyljs/lan/jdk8/jre/lib/amd64/libjava.so
0x00007f962c71d000 64K /home/lyyljs/lan/jdk8/jre/lib/amd64/libverify.so
0x00007f962c92c000 31K /lib/x86_64-linux-gnu/librt-2.15.so
0x00007f962cb34000 1006K /lib/x86_64-linux-gnu/libm-2.15.so
0x00007f962ce30000 16516K /home/lyyljs/lan/jdk8/jre/lib/amd64/server/libjvm.so
0x00007f962de0a000 1772K /lib/x86_64-linux-gnu/libc-2.15.so
0x00007f962e1ca000 14K /lib/x86_64-linux-gnu/libdl-2.15.so
0x00007f962e3ce000 100K /home/lyyljs/lan/jdk8/lib/amd64/jli/libjli.so
0x00007f962e5e4000 132K /lib/x86_64-linux-gnu/libpthread-2.15.so
0x00007f962e801000 145K /lib/x86_64-linux-gnu/ld-2.15.so

-dump:[live,] format=b, file=filename 以hprof二进制格式转储Java堆到指定filename的文件中。live子选项是可选的。如果指定了live子选项,堆中只有活动的对象会被转储。可使用jhat,Visual GC,eclipse Memory Analyzer等工具进行分析。

1
2
3
4
5
6
7
8
9
10
11
12
13
-> % jmap -dump:format=b,file=test.bin 3431
Dumping heap to/home/lyyljs/test.bin ...
Heap dump file created
-> % jhat test.bin
Reading from test.bin...
Dump file created Mon Mar 26 14:09:49 CST 2018
Snapshot read, resolving...
Resolving 1250155 objects...
Chasing references, expect 250 dots..........................................................................................................................................................................................................................................................
Eliminating duplicate references..........................................................................................................................................................................................................................................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.#可以通过ip:7000访问查看分析。

-finalizerinfo 打印等待终结(finalization)的对象信息。

1
2
3
4
5
6
-> % sudo jmap -finalizerinfo 3431
Attaching to process ID 3431, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.66-b17
Number of objects pending for finalization: 0

-heap 打印一个堆的摘要信息,,包括使用的GC算法、堆配置信息和分代堆使用信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
-> % sudo jmap -heap 3431 
Attaching to process ID 3431, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.66-b17

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

Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 268435456 (256.0MB)
NewSize = 134217728 (128.0MB)
MaxNewSize = 134217728 (128.0MB)
OldSize = 134217728 (128.0MB)
NewRatio = 2
SurvivorRatio = 10
MetaspaceSize = 62914560 (60.0MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
capacity = 131072000 (125.0MB)
used = 73502080 (70.0970458984375MB)
free = 57569920 (54.9029541015625MB)
56.07763671875% used
From Space:
capacity = 1572864 (1.5MB)
used = 987520 (0.9417724609375MB)
free = 585344 (0.5582275390625MB)
62.784830729166664% used
To Space:
capacity = 1572864 (1.5MB)
used = 0 (0.0MB)
free = 1572864 (1.5MB)
0.0% used
PS Old Generation
capacity = 134217728 (128.0MB)
used = 30292192 (28.888885498046875MB)
free = 103925536 (99.11111450195312MB)
22.56944179534912% used

19790 interned Strings occupying 1802464 bytes.

-histo[:live] 打印堆的柱状图。其中包括每个Java类,对象数量,内存大小,完全限定的类名。打印的JVM内部类名称将会带有一个****前缀。如果指定了live*子选项,则只计算活动的对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-> % jmap -histo 3431 > test.histo
-> % less test.histo
num #instances #bytes class name
序号 实例数量 字节数 类名
----------------------------------------------
1: 289741 37478104 [C
2: 97559 31077664 [B
3: 192282 4614768 java.lang.String
4: 21694 3215944 [I
5: 76700 2454400 java.util.HashMap$Node
6: 31789 1531960 [Ljava.lang.Object;
7: 20941 1507752 java.lang.reflect.Field
8: 15375 1353000 java.lang.reflect.Method
9: 11452 1214248 [Ljava.util.HashMap$Node;
10: 7957 888752 java.lang.Class
11: 27131 868192 java.util.concurrent.ConcurrentHashMap$Node
...
3299: 1 16 sun.util.locale.provider.TimeZoneNameUtility$TimeZoneNameGetter
3300: 1 16 sun.util.resources.LocaleData
3301: 1 16 sun.util.resources.LocaleData$LocaleDataResourceBundleControl
Total 1213485 100989464

-clstats 打印Java堆的类加载统计信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-> % sudo jmap -clstats 3431
Attaching to process ID 3431, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.66-b17
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> 2778 4860705 null live <internal>
0x00000000f02caf28 1 1473 0x00000000f056f510 dead sun/reflect/DelegatingClassLoader@0x0000000100009df8
0x00000000f02cbd38 1 1471 null dead sun/reflect/DelegatingClassLoader@0x0000000100009df8
0x00000000f0174730 0 0 0x00000000f056f510 live java/util/ResourceBundle$RBClassLoader@0x00000001000c72f8
0x00000000f05410b8 138 282890 null live sun/misc/Launcher$ExtClassLoader@0x000000010000fa30
0x00000000f056f510 4783 7865232 0x00000000f05410b8 live sun/misc/Launcher$AppClassLoader@0x000000010000f688
...

total = 167 8001 13646309 N/A alive=8, dead=159 N/A

-F 强制模式。如果指定的pid没有响应使用该选项,live子选项不支持该模式。

-h|-help 打印帮助信息。

-Jflag 指定传递给运行jmap的JVM的参数。

参考