jmap

作用

jmap全称Java Memory Map,用来展示对象内存映射或堆内存详细信息。
TIPS

  • 此命令是实验性的,不受支持,对于JDK9及更高版本,部分功能可使用 jhsdb jmap 代替,也可用jcmd代替。
  • 部分JDK版本的jmap命令对Windows支持比较有限,参数较少。本文为了更加接近生产环境,都是基于类Unix操作系统编写的。如果在Windows操作系统下测试,应以jmap -h的结果为准。

参考文档:

  1. 命令格式:
  2. ```shell
  3. jmap [options] pid

options的可选项如下:

  • -clstats:连接到正在运行的进程,并打印Java堆的类加载器统计信息
  • -finalizerinfo:连接到正在运行的进程,并打印等待finalization的对象的信息
  • -histo[:live]:连接到正在运行的进程,并打印Java堆的直方图。如果指定了live子选项,则仅统计活动对象
  • -dump:dump_options:连接到正在运行的进程,并转储Java堆。其中,dump_options的取值为:
    • live:指定时,仅Dump活动对象;如果未指定,则转储堆中的所有对象
    • format=b:以hprof格式Dump堆
    • file=filename:将堆Dump到filename

      使用示例

      ```shell

      展示63120进程的类加载统计信息

      jmap -clstats 63120

展示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。