文章目录
- JVM 性能调优监控工具之Jmap和 Jhat
- 前言
- 一、什么是jmap和jhat?
- 二、方式一
- 1.jmap导出堆内存
- 2.以本人项目服务器为例
- 3.查看进程堆内存使用情况
- 4.查看堆内存中的对象数目
- 二、方式二(dump导出文件方式)
- 1.jmap把进程内存dump到文件中
- 2.使用jhat查看存储文件
- 总结
前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、什么是jmap和jhat?jmap命令是把进程内存使用情况转存到dump文件中,再用jhat分析查看,所以说jmap是到处存储文件的,jhat是分析查看的可以这样理解。
二、方式一 1.jmap导出堆内存jmap语法格式如下:
jmap [option] pid jmap [option] executable core jmap [option] [server-id@]remote-hostname-or-ip
如果运行在64位JVM上,可能需要指定-J-d64命令选项参数。
jmap -permstat pid
注意事项
1. jmap -dump 这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用。 2. jmap -permstat 这个命令执行,JVM会去统计perm区的状况,这整个过程也会比较的耗时,并且同样也会暂停应用。 3. jmap -histo:live 这个命令执行,JVM会先触发gc,然后再统计信息。
参数说明:
option: 选项参数。
pid: 需要打印配置信息的进程ID。
executable: 产生核心dump的Java可执行文件。
core: 需要打印配置信息的核心文件。
server-id 可选的唯一id,如果相同的远程主机上运行了多台调试服务器,用此选项参数标识服务器。
remote server IP or hostname 远程调试服务器的IP地址或主机名。
no option: 查看进程的内存映像信息,类似 Solaris pmap 命令。
heap: 显示Java堆详细信息
histo[:live]: 显示堆中对象的统计信息
clstats:打印类加载器信息
finalizerinfo: 显示F-Queue队列等待Finalizer线程执行finalizer方法的对象
dump::生成堆转储快照
F: 当-dump没有响应时,使用-dump或者-histo参数. 在这个模式下,live子参数无效.
help:打印帮助信息
J:指定传递给运行jmap的JVM的参数
首先我根据ps -ef|grep 服务名 查到进程PID
打印进程的类加载器和类加载器加载的持久代对象信息,输出:类加载器名称、对象是否存活(不可靠)、对象地址、父类加载器、已加载的类大小等信息,如下图:
查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况。
jmap -heap pid4.查看堆内存中的对象数目
查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象.
jmap -histo[:live] pid
root@LENOVO-LA0x1516:# jmap -histo:live 11237| more num #instances #bytes class name---------------------------------------------- 1: 37465 51934362: 38325 4237289 3: 5000 3798544 4: 80498 3212605 5: 3500 2315244 6: 2796 1131326
对象class name类型,说明如下:
B byte C char D double F float I int J long Z boolean [ 数组,如[I表示int[] [L+类名 其他对象二、方式二(dump导出文件方式) 1.jmap把进程内存dump到文件中
用jmap把进程内存使用情况dump到文件中,再用jhat分析查看。jmap进行dump命令格式如下
jmap -dump:format=b,file=文件名称自定义 pid
进程ID为11237进行Dump,可以是.txt、dat文件:
root@LENOVO-LA0x1516:/# jmap -dump:format=b,file=/tmp/dcFile.dat 11237 Dumping heap to /tmp/dump.dat ... Heap dump file created2.使用jhat查看存储文件
dump出来的文件可以用MAT、VisualVM等工具查看,这里用jhat查看:
root@LENOVO-LA0x1516:/# jhat -port 7001 /tmp/dcFile.dat Reading from /tmp/dcFile.dat... Dump file created Tue Jan 11 19:47:34 CST 2021Snapshot read, resolving... Resolving 432234 objects... Chasing references, expect 34 dots.......................... Eliminating duplicate references.......................... Snapshot resolved. Started HTTP server on port 7001Server is ready.
我的文件有点大所以导出慢。。。。。。。。
如果Dump文件太大,可能需要加上-J-Xmx512m这种参数指定最大堆内存,即jhat -J-Xmx512m -port 7001 /tmp/dcFile.dat。然后就可以在浏览器中输入主机地址:7001 查看了:
备注:公司保密相关信息不能展示。
总结
这些问题在日常开发、维护中可能被很多人忽视(比如有的人遇到上面的问题只是重启服务器或者调大内存,而不会深究问题根源),但能够理解并解决这些问题是Java程序员进阶的必备要求。。



