JVM 性能调优监控工具之Jmap和 Jhat

JVM 性能调优监控工具之Jmap和 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的参数

2.以本人项目服务器为例

首先我根据ps -ef|grep 服务名 查到进程PID
在这里插入图片描述
打印进程的类加载器和类加载器加载的持久代对象信息,输出:类加载器名称、对象是否存活(不可靠)、对象地址、父类加载器、已加载的类大小等信息,如下图:
在这里插入图片描述

3.查看进程堆内存使用情况

查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况。

jmap -heap pid

在这里插入图片描述

在这里插入图片描述

4.查看堆内存中的对象数目

查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象.

jmap -histo[:live] pid
root@LENOVO-LA0X1516:# jmap -histo:live 11237| more
num     #instances         #bytes  class name----------------------------------------------
   1:         37465        5193436  <constMethodKlass>
   2:         38325        4237289  <methodKlass>
   3:          5000        3798544  <constantPoolKlass>
   4:         80498        3212605  <symbolKlass>
   5:          3500        2315244  <instanceKlassKlass>
   6:          2796        1131326  <constantPoolCacheKlass>

对象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 created

2.使用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程序员进阶的必备要求。。

猜你喜欢

转载自blog.csdn.net/zhx__/article/details/121308029