欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

用jmxterm命令行工具抓取堆内存dump

最编程 2024-02-07 14:22:24
...

在开发/测试环境中,遇到像内存溢出、程序阻塞等情况时需要dump堆内存,一般情况下使用jconsolejvisualvmjmap等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构建的应用,有兴趣的同学可自行深入了解。

[本文完]