JVM命令之jmap

简介

jmap是一个多功能命令,它可以生成Java应用的dump文件,也可以查看堆内对象的统计信息、查看ClassLoader信息和finalizer队列等,但是jmap会将整个JVM的线程全部暂停,所以在生产环境中慎重jmap命令。

image-20200511155155703

参数

  • option:选项参数
  • pid:进程ID
  • executable:生成核心dump的Java可执行文件
  • core:需要打印配置信息的核心文件
  • server_id:唯一服务ID,若一台主机上开启了多个远程debug服务
  • remote server IP or hostname:远程debug服务的主机名或IP

option选项

  • none:查看进程的内存映像信息,和Solaris的pmap命令类似
  • heap:显示JVM堆详细信息
  • histo[:live]:打印堆中对象的统计信息,:live子选项是指定仅打印出存活的对象
  • clstats:打印类加载器信息
  • finalizerinfo:显示正在准备被回收的对象信息
  • dump:<dump-options>:生成堆转储快照
    • live:仅转储堆中存活的对象
    • format=b:二进制方式
    • file:堆转储快照文件
  • F:当dump或histo没有响应时,使用该参数可以强制执行,但是若子选项是:live则使用-F也无效
  • h | help:显示命令的帮助信息
  • j<flag>:给运行中的JVM传参数给jmap

示例

准备:启动一个死循环的main方法

通过jps命令查看应用的pid

pid:10456

  1. jmap pid

    查看进程的内存映像信息

    image-20200511162040121
  2. jmap -heap pid

    显示JVM堆详细信息

    image-20200511162552365

  3. jmap -histo:live pid

    显示堆中存活的对象的统计信息,信息包含每个存活的Java类、对象数量、内存大小(从大到小排列,单位:字节)、类全限定名

    image-20200511173916727

  4. jmap -clstats pid

    打印类加载器信息,信息包含类加载器名称、所加载的类的数量、所加载的类的大小、父加载器、存活状态、加载器地址等

    image-20200511174142448

  5. jmap -finalizerinfo pid

    打印正在等待被回收的对象信息

    image-20200511174414285

    表示当前并无待回收对象

  6. jmap -dump:format=b,file=heapdump.hprof pid

    生成堆转储快照dump文件,以hprof二进制格式转储Java堆信息到指定的文件中,可以使用live子选项指定只将堆中存活的对象转储出来,生成的文件可以使用jhat命令或者MAT工具解析

    image-20200511175932610

总结

在jmap执行时,JVM为了保证dump的信息的可靠性,会暂停应用的所有线程,如果堆内对象过大的话,这个过程会非常耗时,在生产环境慎用。

但是当生产服务处了问题,这个时候不得不使用的话,那就用吧,应用都出问题了,还在意会不会STW干啥。