用jmxterm命令行工具抓取堆内存dump
在开发/测试环境中,遇到像内存溢出、程序阻塞等情况时需要dump堆内存,一般情况下使用jconsole
、jvisualvm
、jmap
等JDK提供的工具即可。但生产环境出于安全性考虑,一般部署在比较封闭的网络环境中,只有部分有权限的用户才能访问,并且生产服务器都是命令行,未安装可视化窗口的。同时,服务器只会安装JRE,没有JDK。另外,现在应用采用docker方式部署居多,创建容器时JMX端口未开放也是常有的事。在这些情况下,当需要dump堆内存或使用JMX命令,就麻爪了。 云环境下,可以临时买一台Windows机器,不过这种方法费钱不说,也麻烦。
铺垫了这么多,今天给大家推荐一款JMX命令行工具jmxterm
。
jmxterm简介
jmxterm
是一个基于命令行的交互式JMX客户端。它允许用户通过命令行控制台访问java mbean服务器。目前最新版本为1.0.1
,了解更多,查看以下链接:
- 官网:http://wiki.cyclopsgroup.org/jmxterm/
- 下载:https://github.com/jiaqi/jmxterm/tags
- 用户手册:https://docs.cyclopsgroup.org/jmxterm/user-manual
dump堆内存
想通过JMX dump堆内存有两件事,第一:dump相关的MBean信息;第二:使用jmxterm生成dump文件。远程dump堆内存底层一般都是通过JMX实现的。
1. MBean基本信息
-
ObjectName:
com.sun.management:type=HotSpotDiagnostic
-
操作名: dumpHeap
以与hprof堆转储相同的格式将堆转储到outputFile文件。 如果从另一个进程远程调用此方法,则堆转储输出将写入运行目标JVM的计算机上名为outputFile的文件。 如果outputFile是相对路径,则它相对于启动目标JVM的工作目录。
-
参数:
- outputFile:依赖于系统的文件名。
- live: 如果 true仅转储 活动对象,即可从其他人访问的对象。
2. 生成dump文件
-
安装 jmxterm
将下载的
jmxterm-1.0.1-uber.jar
复制到已安装JRE/JDK且能访问目标JVM的一台服务器中即可。如果目标JVM运行在docker容器中,且未将JMX端口映射到宿主机或未配置JMX端口,那么需要将
jmxterm-1.0.1-uber.jar
复制到运行目标JVM的docker容器中。只需要两步就可以将文件复制到docker容器中。- 第一步:将文件复制到docker容器所在宿主机;
- 第二步:执行
docker cp src_path container:dest_path
命令复制到容器中,例如:docker cp /data/jmxterm-1.0.1-uber.jar xxx_web:/wb/jmxterm-1.0.1-uber.jar
,将jmxterm-1.0.1-uber.jar
文件从宿主机/data
目录复制到容器xxx_web
的/wb
目录下。
-
连接目标JVM
-
连接本机JVM
-
进入jmxterm命令行
java -jar jmxterm-1.0.1-uber.jar
-
查看本地JVM进程pid
jvms
-
连接JVM进程
open <pid>
-
-
连接远程JVM
- 方法一:参考
连接本机JVM
方式,通过open <ip>:<port>
方式连接。 - 方法二:直接通过命令
java -jar jmxterm-1.0.1-uber.jar -l <ip>:<port>
连接。
- 方法一:参考
-
-
选择JMX MBean
bean com.sun.management:type=HotSpotDiagnostic
-
执行JMX MBean操作
#命令:run dumpHeap <outputFile> <live> run dumpHeap /wp/dump.hprof true
-
下载
dump.hprof
通过JMX生成的dump文件和JVM是同一台机器的。如果目标JVM运行在docker容器中,那么dump文件也在容器中。所以需要将dump文件复制到宿主机,通过执行
docker cp container:src_path dest_path
命令,例如:docker cp xxx_web:/wp/dump.hprof /data/dump.hprof
。
附录: Springboot提供的heapdump接口
此功能是由Spring Boot Actuator提供的。启用heapdump
端点后,默认可以通过访问 http://IP:PORT/actuator/heapdump
生成一个JVM的堆文件。 此方法适合基于Springboot构建的应用,有兴趣的同学可自行深入了解。
[本文完]