jmap 内存优化调试工具
命令 jmap 是一个多功能的命令。它可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。
Usage:
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)
where <option> is one of:
<none> to print same info as Solaris pmap
-heap to print java heap summary
-histo[:live] to print histogram of java object heap; if the "live"
suboption is specified, only count live objects
-clstats to print class loader statistics
-finalizerinfo to print information on objects awaiting finalization
-dump:<dump-options> to dump java heap in hprof binary format
dump-options:
live dump only live objects; if not specified,
all objects in the heap are dumped.
format=b binary format
file=<file> dump heap to <file>
Example: jmap -dump:live,format=b,file=heap.bin <pid>
-F force. Use with -dump:<dump-options> <pid> or -histo
to force a heap dump or histogram when <pid> does not
respond. The "live" suboption is not supported
in this mode.
-h | -help to print this help message
-J<flag> to pass <flag> directly to the runtime system
option 选项参数。
- pid: 需要打印配置信息的进程 ID。
- executable: 产生核心 dump 的 Java 可执行文件。
- core: 需要打印配置信息的核心文件。
- server-id 可选的唯一 id,如果相同的远程主机上运行了多台调试服务器,用此选项参数标识服务器。
- remote server IP or hostname 远程调试服务器的IP地址或主机名。
option
- no option: 查看进程的内存映像信息,类似 Solaris pmap 命令。
- heap: 显示Java堆详细信息
- histo[:live]: 显示堆中对象的统计信息
- clstats:打印类加载器信息
- finalizerinfo: 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
- dump::生成堆转储快照
- F: 当-dump没有响应时,使用-dump或者-histo参数. 在这个模式下,live子参数无效.
- help:打印帮助信息
- J:指定传递给运行jmap的JVM的参数
no option
命令: jmap pid
描述:查看进程的内存映像信息
使用不带选项参数的jmap打印共享对象映射,将会打印目标虚拟机中加载的每个共享对象的起始地址、映射大小以及共享对象文件的路径全称。
heap
命令: jmap -heap pid
描述:显示Java堆详细信息
打印一个堆的摘要信息,包括使用的GC算法、堆配置信息和各内存区域内存使用信息
PWD:workspace pwd$ jmap -heap 21668
Attaching to process ID 21668, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.131-b11
using thread-local object allocation.
Parallel GC with 8 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 4294967296 (4096.0MB)
NewSize = 89128960 (85.0MB)
MaxNewSize = 1431306240 (1365.0MB)
OldSize = 179306496 (171.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 = 295698432 (282.0MB)
used = 71698776 (68.37728118896484MB)
free = 223999656 (213.62271881103516MB)
24.247262832966257% used
From Space:
capacity = 18874368 (18.0MB)
used = 18847464 (17.974342346191406MB)
free = 26904 (0.02565765380859375MB)
99.85745747884114% used
To Space:
capacity = 22020096 (21.0MB)
used = 0 (0.0MB)
free = 22020096 (21.0MB)
0.0% used
PS Old Generation
capacity = 167772160 (160.0MB)
used = 24275368 (23.150794982910156MB)
free = 143496792 (136.84920501708984MB)
14.469246864318848% used
26120 interned Strings occupying 2642096 bytes.
histo[:live]
命令: jmap -histo:live pid
描述:显示堆中对象的统计信息
其中包括每个Java类、对象数量、内存大小(单位:字节)、完全限定的类名。打印的虚拟机内部的类名称将会带有一个’*’前缀。如果指定了live子选项,则只计算活动的对象。
PWD:workspace pwd$ jmap -histo:live 21668
num #instances #bytes class name
----------------------------------------------
1: 56146 5781112 [C
2: 16806 1478928 java.lang.reflect.Method
3: 45538 1457216 java.util.concurrent.ConcurrentHashMap$Node
4: 55985 1343640 java.lang.String
5: 11212 1243680 java.lang.Class
6: 2657 1159528 [B
7: 22717 908680 java.util.LinkedHashMap$Entry
8: 17788 853824 org.aspectj.weaver.reflect.ShadowMatchImpl
9: 10326 743240 [Ljava.util.HashMap$Node;
10: 13049 713896 [Ljava.lang.Object;
11: 11087 620872 java.util.LinkedHashMap
12: 17788 569216 org.aspectj.weaver.patterns.ExposedState
13: 175 424592 [Ljava.util.concurrent.ConcurrentHashMap$Node;
14: 12173 389536 java.util.HashMap$Node
15: 17544 280704 java.lang.Object
16: 10358 227056 [Ljava.lang.Class;
17: 3490 156368 [I
18: 6436 154464 java.util.ArrayList
19: 1950 140400 org.springframework.core.annotation.AnnotationAttributes
clstats
命令: jmap -clstats pid
描述:打印类加载器信息
-clstats 是 -permstat 的替代方案,在 JDK 8 之前,-permstat 用来打印类加载器的数据 打印Java堆内存的永久保存区域的类加载器的智能统计信息。对于每个类加载器而言,它的名称、活跃度、地址、父类加载器、它所加载的类的数量和大小都会被打印。此外,包含的字符串数量和大小也会被打印。
finalizerinfo
命令: jmap -finalizerinfo pid
描述:打印等待终结的对象信息
PWD:workspace pwd$ jmap -finalizerinfo 21668
Attaching to process ID 21668, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.131-b11
Number of objects pending for finalization: 0
Number of objects pending for finalization: 0 说明当前 F-QUEUE 队列中并没有等待 Fializer 线程执行 final
dump
命令: jmap -dump:format=b,file=heapdump.phrof pid
描述:生成堆转储快照 dump 文件。
以 hprof 二进制格式转储 Java 堆到指定 filename 的文件中。live 子选项是可选的。如果指定了 live 子选项,堆中只有活动的对象会被转储。想要浏览 heap dump,你可以使用 jhat(Java 堆分析工具)读取生成的文件。
这个命令执行,JVM 会将整个 heap 的信息 dump 写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用, 线上系统慎用。
也可以设置内存溢出自动导出 dump 文件(内存很大的时候,可能会导不出来)
- -XX:+HeapDumpOnOutOfMemoryError,当 OutOfMemoryError 发生时自动生成 Heap Dump 文件,这可是一个非常有用的参数,因为当你需要分析Java内存使用情况时,往往是在 OOM(OutOfMemoryError)发生时。
- -XX:+HeapDumpBeforeFullGC 当 JVM 执行 FullGC 前执行 dump。
- -XX:+HeapDumpAfterFullGC当 JVM 执行 FullGC 后执行 dump。
- -XX:+HeapDumpOnCtrlBreak交互式获取 dump。在控制台按下快捷键 Ctrl + Break 时,JVM 就会转存一下堆快照。
- -XX:HeapDumpPath=./(路径)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论