简介
jmap是一个多功能命令,它可以生成Java应用的dump文件,也可以查看堆内对象的统计信息、查看ClassLoader信息和finalizer队列等,但是jmap会将整个JVM的线程全部暂停,所以在生产环境中慎重jmap命令。
参数
- 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
-
jmap pid
查看进程的内存映像信息
-
jmap -heap pid
显示JVM堆详细信息
-
jmap -histo:live pid
显示堆中存活的对象的统计信息,信息包含每个存活的Java类、对象数量、内存大小(从大到小排列,单位:字节)、类全限定名
-
jmap -clstats pid
打印类加载器信息,信息包含类加载器名称、所加载的类的数量、所加载的类的大小、父加载器、存活状态、加载器地址等
-
jmap -finalizerinfo pid
打印正在等待被回收的对象信息
表示当前并无待回收对象
-
jmap -dump:format=b,file=heapdump.hprof pid
生成堆转储快照dump文件,以hprof二进制格式转储Java堆信息到指定的文件中,可以使用live子选项指定只将堆中存活的对象转储出来,生成的文件可以使用jhat命令或者MAT工具解析
总结
在jmap执行时,JVM为了保证dump的信息的可靠性,会暂停应用的所有线程,如果堆内对象过大的话,这个过程会非常耗时,在生产环境慎用。
但是当生产服务处了问题,这个时候不得不使用的话,那就用吧,应用都出问题了,还在意会不会STW干啥。