jmap
作用
jmap全称Java Memory Map,用来展示对象内存映射或堆内存详细信息。
TIPS
- 此命令是实验性的,不受支持,对于JDK9及更高版本,部分功能可使用 jhsdb jmap 代替,也可用jcmd代替。
- 部分JDK版本的jmap命令对Windows支持比较有限,参数较少。本文为了更加接近生产环境,都是基于类Unix操作系统编写的。如果在Windows操作系统下测试,应以jmap -h的结果为准。
参考文档:
- Java 8 Unix:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jmap.html
- JDK 8 Windows:https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jmap.html
Java 11:https://docs.oracle.com/en/java/javase/11/tools/jmap.html
使用说明
命令如下: ```shell ➜ jmap -h Usage: jmap -clstats
to connect to running process and print class loader statistics
jmap -finalizerinfo
to connect to running process and print information on objects awaiting finalization
jmap -histo[:live]
to connect to running process and print histogram of java object heap
if the "live" suboption is specified, only count live objects
jmap -dump:
to connect to running process and dump java heap
jmap -? -h —help
to print this help message
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
命令格式:
```shell
jmap [options] pid
options的可选项如下:
- -clstats:连接到正在运行的进程,并打印Java堆的类加载器统计信息
- -finalizerinfo:连接到正在运行的进程,并打印等待finalization的对象的信息
- -histo[:live]:连接到正在运行的进程,并打印Java堆的直方图。如果指定了live子选项,则仅统计活动对象
- -dump:dump_options:连接到正在运行的进程,并转储Java堆。其中,dump_options的取值为:
展示63120进程中等待finalization的对象的信息
jmap -finalizerinfo 63120
展示63120进程中堆的直方图
jmap -histo 63120
展示63120进程堆中存活对象的直方图
jmap -histo:live 63120
Dump 63120这个进程中的存货对象的堆到dump.hprof文件
jmap -dump:live,format=b,file=dump.hprof 63120
```
拓展知识
要想获取Java堆Dump,除使用jmap外,还有以下方法:
- 使用-XX:+HeapDumpOnOutOfMemoryError,让虚拟机在OOM异常出现后自动生成堆Dump文件;
- 使用-XX:+HeapDumpOnCtrlBreak,可使用[Ctrl]+[Break],让虚拟机生成堆Dump文件;
- 在Linux操作系统下,发送 kill -3 pid 命令;
- 对于Spring Boot应用,也可以使用Spring Boot Actuator提供的/actuator/heapdump实现堆Dump。