
jmap是java虚拟机自带的一种内存映像工具,我们可以通过该工具配合不同的参数来查看java虚拟机内存的详细信息(如程序中出现的所有对象的数量以及占用内存大小等),以及通过虚拟机内存的使用情况来定位以及分析程序中出现的问题。下面将详介绍该命令的使用。
jmap [option] <pid>
(to connect to running process) 连接到正在运行的进程
jmap [option] <executable <core>
(to connect to a core file) 连接到核心文件
jmap [option] [server_id@]<remote server IP or hostname>
(to connect to remote debug server) 连接到远程调试服务
pid: 目标进程的PID,进程编号,可以采用ps -ef | grep java 查看java进程的PID
基本参数[option]说明与案例
该参数将会打印堆内存(heap)的概要信息,GC使用的算法,heap的配置,内存使用情况等信息。
jmap -heap 24984
说明:24984 是程序的pid
C:\Users\LENOVO>jmap -heap 24984
Attaching to process ID 24984, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.161-b12
using thread-local object allocation.
Parallel GC with 4 thread(s) //GC 方式
Heap Configuration: //堆内存初始化配置
MinHeapFreeRatio = 0 //对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)
MaxHeapFreeRatio = 100 //对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)
MaxHeapSize = 4267704320 (4070.0MB) //对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小
NewSize = 89128960 (85.0MB) //对应jvm启动参数-XX:NewSize=设置JVM堆的‘新生代’的默认大小
MaxNewSize = 1422393344 (1356.5MB) //对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小
OldSize = 179306496 (171.0MB) //对应jvm启动参数-XX:OldSize=<value>:设置JVM堆的‘老生代’的大小
NewRatio = 2 //对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
SurvivorRatio = 8 //对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值
MetaspaceSize = 21807104 (20.796875MB) // 元空间进行fgc的阈值
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB //元空间的内存的实现就是本地内存,所以默认是本地内存的大小
G1HeapRegionSize = 0 (0.0MB)
Heap Usage: //堆内存使用情况
PS Young Generation
Eden Space: //Eden区内存分布
capacity = 136839168 (130.5MB) //Eden区总容量
used = 89439976 (85.2966079711914MB) //Eden区已使用
free = 47399192 (45.203392028808594MB) //Eden区剩余容量
65.36138541853748% used //Eden区使用比率
From Space: //其中一个Survivor区的内存分布
capacity = 17825792 (17.0MB)
used = 15765912 (15.035545349121094MB)
free = 2059880 (1.9644546508789062MB)
88.44438440659466% used
To Space: //另一个Survivor区的内存分布
capacity = 19922944 (19.0MB)
used = 0 (0.0MB)
free = 19922944 (19.0MB)
0.0% used
PS Old Generation //当前的Old区内存分布
capacity = 184025088 (175.5MB)
used = 21898568 (20.88410186767578MB)
free = 162126520 (154.61589813232422MB)
11.899773143974803% used
26048 interned Strings occupying 3009800 bytes.
该参数将会 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量.。
jmap -histo:live 24984
C:\Users\LENOVO>jmap -histo:live 24984
num #instances(实例数) #bytes(字节大小) class name(类名) ----------------------------------------------
1: 90973 43448952 [B
2: 268286 32546840 [C
3: 30631 11078832 [I
4: 173127 4155048 java.lang.String
5: 48189 2620928 [Ljava.lang.Object;
6: 23291 2049608 java.lang.reflect.Method
7: 9985 1109960 java.lang.Class
8: 33297 1065504 java.util.concurrent.ConcurrentHashMap$Node
9: 12709 901240 [Ljava.util.HashMap$Node;
10: 27986 895552 java.util.HashMap$Node
11: 21350 854000 java.util.LinkedHashMap$Entry
12: 12383 693448 java.util.LinkedHashMap
13: 26190 628560 java.lang.StringBuilder
14: 25778 618672 java.util.ArrayList
...
..
.
该参数将会 使用hprof二进制的形式输出jvm的heap内容到指定文件,live子选项是可选的,假如指定live选项,那么只输出活的对象到文件。
jmap -dump:live,format=b,file=a.hprof 24984
C:\Users\LENOVO>jmap -dump:live,format=b,file=a.hprof 24984
Dumping heap to C:\Users\LENOVO\a.hprof ...
Heap dump file created
这样堆内存快照就在指定的文件夹中创建完成了,可以使用其他工具(如 Eclipse Memory Analyzer)分析堆内存的具体细节。
打印正等候回收的对象的信息
jmap -finalizerinfo 24984
C:\Users\LENOVO>jmap -finalizerinfo 24984
Attaching to process ID 24984, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.161-b12
Number of objects pending for finalization: 0 //(等待回收的对象为0)
该参数打印classload的信息。包含每个classloader的名字、活泼性、地址、父classloader和加载的class数量
jmap -clstats 24984
C:\Users\LENOVO>jmap -clstats 24984
Attaching to process ID 24984, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.161-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> 2705 4589209 null live <internal>
0x00000006c2513350 1 880 0x00000006c1a14af0 dead sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000006c3350130 1 880 0x00000006c1a14af0 dead sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000006c2513e58 1 1472 null dead sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000006c3350838 1 880 0x00000006c1a14af0 dead sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000006c3351d38 1 1473 0x00000006c1a14af0 dead sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000006c3355838 1 1472 0x00000006c1a14af0 dead sun/reflect/DelegatingClassLoader@0x00000007c0009df8