java 命令行 jmx_使用JMX命令行工具jmxterm dump堆内存

在开发/测试环境中,遇到像内存溢出、程序阻塞等情况时需要dump堆内存,一般情况下使用jconsole 、jvisualvm、jmap等JDK提供的工具即可。但生产环境出于安全性考虑,一般部署在比较封闭的网络环境中,只有部分有权限的用户才能访问,并且生产服务器都是命令行,未安装可视化窗口的。同时,服务器只会安装JRE,没有JDK。另外,现在应用采用docker方式部署居多,创建容器时JMX端口未开放也是常有的事。在这些情况下,当需要dump堆内存或使用JMX命令,就麻爪了。 云环境下,可以临时买一台Windows机器,不过这种方法费钱不说,也麻烦。

铺垫了这么多,今天给大家推荐一款JMX命令行工具jmxterm。

jmxterm简介

jmxterm是一个基于命令行的交互式JMX客户端。它允许用户通过命令行控制台访问java mbean服务器。目前最新版本为1.0.1,了解更多,查看以下链接:

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

连接远程JVM

方法一:参考 连接本机JVM 方式,通过 open : 方式连接。

方法二:直接通过命令 java -jar jmxterm-1.0.1-uber.jar -l : 连接。

选择JMX MBean bean com.sun.management:type=HotSpotDiagnostic

执行JMX MBean操作 #命令:run dumpHeap

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构建的应用,有兴趣的同学可自行深入了解。

[本文完]

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值