jmap
JVM Memory Map命令用于生成heap dump文件,如果不使用这个命令,还可以使用-XX:+HeapDumpOnOutOfMemoryError参数来让虚拟机出现OOM的时候自动生成dump文件。
jmap不仅能生成dump文件,还可以查询finalize执行队列、Java堆和永久代的详细信息,如当前使用率、当前使用的是哪种收集器等。【内存分析】
命令格式
jmap [ option ] pid
jmap [ option ] executable core
jmap [ option ] [server-id@]remote-hostname-or-IP
参数
option:选项参数,不可同时使用多个选项参数
pid:java进程id,命令ps -ef | grep java获取
executable:产生核心dump的java可执行文件
core:需要打印配置信息的核心文件
remote-hostname-or-ip:远程调试的主机名或ip。
server-id:可选的唯一id,如果相同的远程主机上运行了多台调试服务器,用此选项参数标识服务器。
options参数
heap : 显示Java堆详细信息
histo : 显示堆中对象的统计信息
permstat :Java堆内存的永久保存区域的类加载器的统计信息
finalizerinfo : 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
dump : 生成堆转储快照
F : 当-dump没有响应时,强制生成dump快照
-heap
打印heap的概要信息,GC使用的算法,heap的配置及使用情况,可以用此来判断内存目前的使用情况以及垃圾回收情况。
[root@xx254203 ~]# jmap -heap 1341
Attaching to process ID 1341, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.181-b13
using thread-local object allocation.
Mark Sweep Compact GC
Heap Configuration:
MinHeapFreeRatio = 40 //对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)
MaxHeapFreeRatio = 70//对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)
MaxHeapSize = 132120576 (126.0MB) //对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小
NewSize = 2752512 (2.625MB) //对应jvm启动参数-XX:NewSize=设置JVM堆的‘新生代’的默认大小
MaxNewSize = 44040192 (42.0MB) //对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小
OldSize = 5636096 (5.375MB) //对应jvm启动参数-XX:OldSize=<value>:设置JVM堆的‘老生代’的大小
NewRatio = 2 //对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
SurvivorRatio = 8 //对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值
MetaspaceSize = 21807104 (20.796875MB) //元空间大小
CompressedClassSpaceSize = 1073741824 (1024.0MB) //压缩类空间大小
MaxMetaspaceSize = 17592186044415 MB //最大元空间大小
G1HeapRegionSize = 0 (0.0MB)
//Region是实现G1算法的基础,每个Region的大小相等,通过-XX:G1HeapRegionSize参数可以设置Region的大小
Heap Usage: //堆内存分步
New Generation (Eden + 1 Survivor Space):
capacity = 7667712 (7.3125MB)
used = 3396264 (3.2389297485351562MB)
free = 4271448 (4.073570251464844MB)
44.29305639022436% used
Eden Space://Eden区内存分布
capacity = 6881280 (6.5625MB) //Eden区总容量
used = 3387328 (3.23040771484375MB) //Eden区已使用
free = 3493952 (3.33209228515625MB) //Eden区剩余容量
49.225260416666664% used //Eden区使用比率
From Space://其中一个Survivor区的内存分布
capacity = 786432 (0.75MB)
used = 8936 (0.00852203369140625MB)
free = 777496 (0.7414779663085938MB)
1.1362711588541667% used
To Space: //另一个Survivor区的内存分布
capacity = 786432 (0.75MB)
used = 0 (0.0MB)
free = 786432 (0.75MB)
0.0% used
tenured generation://老年代
capacity = 16805888 (16.02734375MB)
used = 13239288 (12.625968933105469MB)
free = 3566600 (3.4013748168945312MB)
78.77767601450158% used
11998 interned Strings occupying 1724416 bytes.
-dump
dump堆到文件,format指定输出格式,live指明是活着的对象,file指定文件名
[root@xx254203 ~]# jmap -dump:live,format=b,file=/tmp/dump.hprof 1341
Dumping heap to /tmp/dump.hprof ...
Heap dump file created
-finalizerinfo
打印等待回收的对象信息
[root@localhost jdk1.7.0_79]# jmap -finalizerinfo 24971
Attaching to process ID 24971, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.79-b02
Number of objects pending for finalization: 0
Number of objects pending for
finalization: 0 说明当前F-QUEUE队列中并没有等待Fializer线程执行finalizer方法的对象
-histo
打印堆的对象统计,包括对象数、内存大小等等。jmap -histo:live 这个命令执行,JVM会先触发gc,然后再统计信息
[root@xx254203 ~]# jmap -histo:live 1341 |more
num #instances #bytes class name
----------------------------------------------
1: 30901 5811600 [C
2: 29765 714360 java.lang.String
3: 14864 475648 java.util.HashMap$Node
4: 4518 397584 java.lang.reflect.Method
5: 3001 340728 java.lang.Class
6: 795 316000 [B
7: 3530 206144 [Ljava.lang.Object;
8: 958 171184 [Ljava.util.HashMap$Node;
9: 4740 151680 java.util.concurrent.ConcurrentHashMap$Node
10: 1666 84176 [I
11: 1563 75024 java.util.HashMap
12: 820 63488 [Ljava.lang.String;
13: 3968 63488 java.lang.Object
14: 1247 49880 java.util.LinkedHashMap$Entry
15: 2451 49576 [Ljava.lang.Class;
16: 1434 45888 java.util.Hashtable$Entry
17: 1027 41080 java.util.TreeMap$Entry
18: 817 39216 org.apache.tomcat.util.modeler.AttributeInfo
19: 482 38560 java.lang.reflect.Constructor
20: 76 37152 [Ljava.util.concurrent.ConcurrentHashMap$Node;
21: 133 33672 [[C
22: 789 31560 java.lang.ref.SoftReference
。。。。。。。
jmap -histo:live 24971 | grep com.yuhuo 查询类名包含com.yuhuo的信息
jmap -histo:live 24971 | grep com.yuhuo > histo.txt 保存信息到histo.txt文件
附 - jmap输出中class name非自定义类的说明:
BaseType Character | Type | Interpretation |
---|---|---|
B | byte | signed byte |
C | char | Unicode character |
D | double | double-precision floating-point value |
F | float | single-precision floating-point value |
I | int | integer |
J | long | long integer |
L; | reference | an instance of class |
S | short | signed short |
Z | boolean | true or false |
[ | reference | one array dimension,[I表示int[] |
-permstat
打印Java堆内存的永久区的类加载器的智能统计信息。对于每个类加载器而言,它的名称、活跃度、地址、父类加载器、它所加载的类的数量和大小都会被打印。此外,包含的字符串数量和大小也会被打印。
-clstats
Java堆中内存的类加载器的统计信息
[root@xx254203 ~]# jmap -clstats 1341
Attaching to process ID 1341, 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> 2002 3420852 null live <internal>
0x00000000fad3c310 1 1473 0x00000000fac78820 dead sun/reflect/DelegatingClassLoader@0x000000010000a028
0x00000000fad3c950 1 1473 0x00000000fac78820 dead sun/reflect/DelegatingClassLoader@0x000000010000a028
0x00000000fb430000 1 1473 0x00000000fac78820 dead sun/reflect/DelegatingClassLoader@0x000000010000a028
0x00000000fac78970 35 56572 0x00000000fac96cc0 live sun/misc/Launcher$AppClassLoader@0x000000010000f8d0
0x00000000fad7cb20 1 1476 0x00000000fac78820 dead sun/reflect/DelegatingClassLoader@0x000000010000a028
0x00000000fad3c568 1 1473 0x00000000fac78820 dead sun/reflect/DelegatingClassLoader@0x000000010000a028
0x00000000fb539228 0 0 0x00000000fac78820 live org/apache/catalina/loader/ParallelWebappClassLoader@0x00000001001731e8
0x00000000fb4d37f0 1 1473 0x00000000fac78820 dead sun/reflect/DelegatingClassLoader@0x000000010000a028
0x00000000fb4d3e30 1 1476 0x00000000fac78820 dead sun/reflect/DelegatingClassLoader@0x000000010000a028
total = 44 2723 4801535 N/A alive=10, dead=34 N/A
-F
强制模式。如果指定的pid没有响应,请使用jmap -dump或jmap -histo选项。此模式下,不支持live子选项。