博客
关于我
jvisualvm工具使用
阅读量:798 次
发布时间:2023-03-22

本文共 3316 字,大约阅读时间需要 11 分钟。

jvisualvm JVM性能监控与内存诊断工具使用指南

jvisualvm 是JDK自带的图形界面操作功能的JVM性能监控和诊断工具,支持分析堆转储文件、在线实时监控本地JVM进程,以及远程服务器上的JVM进程。以下是关于jvisualvm 的使用指南,包括如何下载堆转储文件、分析内存溢出dump文件、监控本地JVM以及远程JVM的操作方法。


1. 分析服务器下载dump文件

要从服务器下载堆转储文件并分析,可以按照以下步骤操作:

  • 在安装JDK的bin目录下双击 jvisaulvm.exe程序,程序启动后会进入Java VisualVM界面。
  • 点击文件 > 装入 > 选择文件名和文件类型,文件类型选择【堆Dump】导入从服务器下载的dump文件。
  • 点击【打开】后,Java VisualVM UI右侧主界面会新增一个Tab页,显示导入的dump文件概要信息。
  • 点击【显示线程】链接可以查看线程信息。
  • 点击【概要】右侧的【类】可以查看主要占内存的类名、实例数及占内存大小。
  • 注意:生产环境中建议通过设置JVM启动参数 -XX:+HeapDumpOnOutOfMemoryError 和 -XX:HeapDumpPath=

    实现堆转储文件自动生成,并通过jvisualvm 或 Eclipse Memory Analyzer 进行分析。


    2. 分析内存溢出dump文件

    要分析内存溢出dump文件,需先设置JVM启动参数:

  • 在本地Java服务中通过IDEA设置启动类参数,添加以下四个JVM启动参数:
    -Xms50m -Xmx50m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\heapdump\blogDump.hprof
  • 在JVMTestController类中新增一个能导致内存溢出的接口:
    @GetMapping("/testOutMemoryError")
    public RespBean outMemoryErrorTest() {
    List
    userDTOList = new ArrayList<>();
    for (int i = 0; i < 1000000; i++) {
    UserDTO userDTO = new UserDTO();
    // ...用户数据初始化逻辑...
    userDTOList.add(userDTO);
    }
    RespBean respBean = new RespBean();
    respBean.setStatus(200);
    respBean.setMsg("success");
    respBean.setData(userDTOList);
    return respBean;
    }
  • 重启服务后,点击ApiPost中的发送按钮一段时间,会返回内存溢出异常信息,并在D:\heapdump目录下生成blogDump.hprof文件。
  • 将生成的dump文件导入jvisualvm,查看内存溢出堆转储概要信息和类实例信息。
  • 从内存溢出堆转储实例信息可以看到,UserDTO类产生了47899个实例对象,占用了4406708字节的堆内存。


    3. 本地JVM监控

    监控本地JVM非常简单,打开jvisualvm即可从左侧栏目看到本机应用。点击对应的应用可以查看内存、线程和GC信息。

    如果应用出现线程死锁,可以通过线程Tab页查看死锁信息。点击右上方的线程Dump链接可以看到线程死锁的具体原因。


    5. 远程JVM监控

    jvisualvm 远程监控功能可以帮助我们监控远程服务器上的JVM进程,适用于测试环境中的性能测试和优化。

  • 配置远程监控:

    • 使用jvisualvm监控远程服务器上的JVM,需先配置jmx支持。
    • 配置方法:
      • jar包启动:直接运行以下命令:
        nohup java -Dcom.sun.management.jmxremote \
        -Dcom.sun.management.jmxremote.port=8999 \
        -Dcom.sun.management.jmxremote.local.only=true \
        -Dcom.sun.management.jmxremote.authenticate=true \
        -Dcom.sun.management.jmxremote.ssl=false \
        -Dcom.sun.management.jmxremote.rmi.port=8999 \
        -Dcom.sun.management.jmxremote.access.file=jmx.access \
        -Dcom.sun.management.jmxremote.password.file=jmx.password \
        -Djava.rmi.server.hostname=159.138.489 \
        -jar jstx-server.jar &
      • tomcat启动:编辑catalina.sh配置文件,添加JAVA_OPTS:
        JAVA_OPTS="-Dcom.sun.management.jmxremote \
        -Dcom.sun.management.jmxremote.port=8999 \
        -Dcom.sun.management.jmxremote.local.only=true \
        -Dcom.sun.management.jmxremote.authenticate=true \
        -Dcom.sun.management.jmxremote.ssl=false \
        -Dcom.sun.management.jmxremote.rmi.port=8999 \
        -Dcom.sun.management.jmxremote.access.file=jmx.access \
        -Dcom.sun.management.jmxremote.password.file=jmx.password \
        -Djava.rmi.server.hostname=159.138.489"
    • 创建jmx.access和jmx.password文件,配置用户名和密码:
      vim jmx.access
      admin readwrite
      vim jmx.password
      admin 123456
    • 修改文件权限:
      chmod -R 600 jmx.password
      chmod -R 600 jmx.access
  • 建立内网与公网IP映射:

    vim /etc/hosts
    # 添加映射记录
    192.168.1.100 localhost
    192.168.1.100 remote-server
  • 3.开放防火墙和云服务器安全组策略:

    • 防火墙开放Dcom.sun.management.jmxremote.port对应的端口。
    • 云服务器安全组策略允许Dcom.sun.management.jmxremote.port对应的端口。
    1. 远程连接jvisualvm:
      • 添加远程服务器:点击右上角的远程服务器图标,输入IP地址和端口。
      • 建立JMX连接:点击连接按钮,输入用户名和密码。
    2. 连接成功后,可以像监视本地JVM进程一样监视远程服务器上的JVM进程。


      总结

      通过jvisualvm,我们可以轻松分析堆转储文件、监控本地JVM进程以及远程服务器上的JVM进程。在生产环境中,建议使用Arthas中间件进行线上JVM调优,以提高性能和稳定性。

    转载地址:http://yxqfk.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现感知哈希算法(附完整源码)
    查看>>
    Objective-C实现截留雨水问题的动态编程方法算法(附完整源码)
    查看>>
    Objective-C实现截留雨水问题的蛮力方法的算法(附完整源码)
    查看>>
    Objective-C实现打印10000以内的完数(附完整源码)
    查看>>
    Objective-C实现打印1000以内的水仙花数(附完整源码)
    查看>>
    Objective-C实现打印九九乘法表(附完整源码)
    查看>>
    Objective-C实现打印从 0 到 n 的卡特兰数算法(附完整源码)
    查看>>
    Objective-C实现打印函数调用堆栈( 附完整源码)
    查看>>
    Objective-C实现打印月份的日历算法(附完整源码)
    查看>>
    Objective-C实现打印杨辉三角(附完整源码)
    查看>>
    Objective-C实现打印某年的历法日期(附完整源码)
    查看>>
    Objective-C实现打印魔方矩阵(附完整源码)
    查看>>
    Objective-C实现打格点算法(附完整源码)
    查看>>
    Objective-C实现批量修改文件类型算法(附完整源码)
    查看>>
    Objective-C实现找出一个数的质因数primeFactors算法(附完整源码)
    查看>>
    Objective-C实现找出三角形从上到下的最大路径算法(附完整源码)
    查看>>
    Objective-C实现找出买卖股票的最大利润算法(附完整源码)
    查看>>
    Objective-C实现找出二维数组中的鞍点(附完整源码)
    查看>>
    Objective-C实现找出由两个 3 位数字的乘积构成的最大回文数的算法 (附完整源码)
    查看>>
    Objective-C实现找到一个数字数组的中值算法(附完整源码)
    查看>>