loong - Java 命令 - jmap
jmap(Java Virtual Machine Memory Map)是JDK提供的一个可以生成Java虚拟机的堆转储快照dump文件的命令行工具。除此以外,jmap命令还可以查看finalize执行队列、Java堆和方法区的详细信息,比如空间使用率、当前使用的什么垃圾回收器、分代情况等等。
基本语法
jmap [options] pid
参数说明
option
:jmap命令的可选参数。如果没有指定这个参数,命令会显示Java虚拟机进程的内存映像信息
常用选项
-
:显示Java虚拟机进程的内存映像信息
-
-heap:打印堆信息
- 被指定的垃圾回收算法的信息,包括垃圾回收算法的名称和垃圾回收算法的详细信息。
- 堆的配置信息,可能是由命令行选项指定,或者由Java虚拟机根据服务器配置选择的。
- 堆的内存空间使用信息,包括分代情况,每个代的总容量、已使用内存、可使用内存。如果某一代被继续细分(例如,年轻代),则包含细分的空间的内存使用信息。
-
-histo[:live]:显示Java堆中对象的统计信息,包括:对象数量、占用内存大小(单位:字节)和类的完全限定名
-
-clstats:显示Java堆中元空间的类加载器的统计信息
- class_loader:当Java虚拟机运行时,类加载器对象的地址
- classes:已加载类的数量
- bytes:该类加载器加载的所有类的元数据所占的字节数
- parent_loader:父类加载器对象的地址,如果没有显示null。
- alive:是否存活的标识,表示类加载器对象是否将被垃圾回收。
- type:该类加载器的类名。
-
-finalizerinfo:显示在F-Queue中等待Finalizer线程执行finalize方法的对象
-
-dump::生成Java虚拟机的堆转储快照dump文件
live
参数是可选的,如果指定,则只转储堆中的活动对象;如果没有指定,则转储堆中的所有对象。format=b
表示以hprof二进制格式转储Java堆的内存。file=<filename>
用于指定快照dump文件的文件名。
-
-F:强制模式。如果指定的pid没有响应,可以配合
-dump
或-histo
一起使用。此模式下,不支持live参数 -
-J:传递参数给jmap启动的jvm
命令演示
jmap -heap [pid]
- 被指定的垃圾回收算法的信息,包括垃圾回收算法的名称和垃圾回收算法的详细信息。
- 堆的配置信息,可能是由命令行选项指定,或者由Java虚拟机根据服务器配置选择的。
- 堆的内存空间使用信息,包括分代情况,每个代的总容量、已使用内存、可使用内存。如果某一代被继续细分(例如,年轻代),则包含细分的空间的内存使用信息。
C:\WINDOWS\system32>jmap -heap 18072
Attaching to process ID 18072, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.391-b13
using thread-local object allocation.
Parallel GC with 10 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 12819890176 (12226.0MB)
NewSize = 267386880 (255.0MB)
MaxNewSize = 4272947200 (4075.0MB)
OldSize = 535822336 (511.0MB)
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 = 252182528 (240.5MB)
used = 221704848 (211.43421936035156MB)
free = 30477680 (29.065780639648438MB)
87.9144363244705% used
From Space:
capacity = 11534336 (11.0MB)
used = 0 (0.0MB)
free = 11534336 (11.0MB)
0.0% used
To Space:
capacity = 33030144 (31.5MB)
used = 0 (0.0MB)
free = 33030144 (31.5MB)
0.0% used
PS Old Generation
capacity = 800063488 (763.0MB)
used = 60388944 (57.59138488769531MB)
free = 739674544 (705.4086151123047MB)
7.548018989213016% used
21427 interned Strings occupying 2023952 bytes.
jmap -histo[:live]
# 方式一 输出所有对象
jmap -histo pid
# 方式二 输出所有活动对象 (:live 会先出发gc)
jmap -histo:live pid
# 方式三 输出前10个数据
jmap -histo pid | head -n 11
# 方式四 输出到指定文件
jmap -histo pid >a.log
# 方式五 输出大对象
jmap -histo pid | more
# 方式六 输出少对象
jmap -histo pid | less
# 输出所有对象(太多了做了截取)
C:\WINDOWS\system32>jmap -histo 18072
num #instances #bytes class name
----------------------------------------------
1: 240247 78724144 [B
2: 470342 54201160 [C
3: 64696 45506688 [I
4: 262144 27262976 org.apache.logging.log4j.core.async.RingBufferLogEvent
5: 262139 8388448 org.apache.logging.log4j.util.SortedArrayStringMap
6: 262144 6291456 org.apache.logging.log4j.core.time.MutableInstant
7: 257706 6184944 java.lang.String
8: 230034 4709848 [Ljava.lang.Class;
9: 61032 4409824 [Ljava.lang.Object;
10: 113236 3623552 java.util.concurrent.locks.AbstractQueuedSynchronizer$Node
11: 27915 2456520 java.lang.reflect.Method
12: 71090 2274880 java.util.ArrayList$Itr
13: 27894 1562064 jdk.internal.org.objectweb.asm.Item
14: 30938 1485024 java.util.HashMap
15: 16933 1370072 [Ljava.util.HashMap$Node;
16: 15286 1192240 [S
17: 10672 1173000 java.lang.Class
18: 20725 1160600 java.util.LinkedHashMap
19: 34741 1111712 java.util.HashMap$Node
20: 33686 1077952 java.util.concurrent.ConcurrentHashMap$Node
21: 41386 993264 java.lang.StringBuilder
# 只计算活动的对象(会触发gc)
C:\WINDOWS\system32>jmap -histo:live 18072
# 与上面一样的效果
jmap -clstats [pid]
- class_loader:当Java虚拟机运行时,类加载器对象的地址
- classes:已加载类的数量
- bytes:该类加载器加载的所有类的元数据所占的字节数
- parent_loader:父类加载器对象的地址,如果没有显示null。
- alive:是否存活的标识,表示类加载器对象是否将被垃圾回收。
- type:该类加载器的类名。
C:\Users\niesh>jmap -clstats 15968
Attaching to process ID 15968, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.333-b02
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> 2710 4828467 null live <internal>
0x00000006c6e8bce8 1 1471 null dead sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006c6e8c5e8 1 1471 null dead sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006c6812080 1 1472 0x00000006c5b93dc0 dead sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006c70a5308 1 880 null dead sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006c5f3f2f0 1 1471 null dead sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006c6068d00 1 1471 null dead sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006c6e8ade0 1 880 0x00000006c5b93dc0 dead sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006c6e8dae0 1 1471 0x00000006c5b93dc0 dead sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006c5f3d5f8 1 1481 null dead sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006c5f3f9f8 1 1471 null dead sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
0x00000006c6e8a9f8 1 880 0x00000006c5b93dc0 dead sun/reflect/DelegatingClassLoader@0x00000007c000a0a0
jmap -finalizerinfo [pid]
C:\Users\niesh>jmap -finalizerinfo 15968
Attaching to process ID 15968, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.333-b02
Number of objects pending for finalization: 0
jmap -dump [dump-options] [pid]
live
参数是可选的,如果指定,则只转储堆中的活动对象;如果没有指定,则转储堆中的所有对象。format=b
表示以hprof二进制格式转储Java堆的内存。file=<filename>
用于指定快照dump文件的文件名。
jmap -dump:format=b,file=/path/heap.bin 15968