JVM监控性能调优GUI篇(二)- Visual VM

JVM监控性能调优GUI篇(二)- Visual VM

概述

? VisualVM 是一个集成了命令行 JDK 工具和轻量级分析功能的可视化工具。 专为开发和生产时间使用而设计。是目前JDK自带工具里,比较综合实用的一个可视化工具,代替常用命令行工具,可以查看虚拟机进程及进程 的配置和环境信息(jpsjinfo),监视程序的CPU, GC, 堆, 方法区及线程的信息(jstatjstack)等, 甚至代替jConsole。

官网地址: https://visualvm.github.io/

安装

  • IDEA插件
    1. 首先在IDEA中搜索 VisualVM Launcher 插件并安装

    2. 重启IDEA,然后配置该插件,不然启动不了

      JVM监控性能调优GUI篇(二)- Visual VM
    3. 点击启动按钮,再选择具体的java进程即可

      JVM监控性能调优GUI篇(二)- Visual VM

  • JDK自带

    在自己安装的 JAVA_HOME/bin 目录下,找 jvisualvm (在java这边多了一个j的前缀)即可

    JVM监控性能调优GUI篇(二)- Visual VM

连接方式

  • 本地连接

    ? 打开后能看到本地所有java进程的进程名和进程ID(类似 jps), 点击具体进程就可看到详情。

    JVM监控性能调优GUI篇(二)- Visual VM

  • 远程连接
    1. 确定远程服务器的ip地址
    2. 添加JMX(通过JMX技术具体监控远程服务器哪个Java进程)
    3. 修改bin/catalina.sh文件,连接远程的tomcat
    4. 在…/conf中添加jmxremote.access和jmxremote.password文件
    5. 将服务器地址改成公网ip地址
    6. 设置网络安全策略和防火墙策略
    7. 启动tomcat,查看tomcat启动日志和端口监听
    8. JMX中输入端口号、用户名、密码登录

主要功能

  • 生成/读取堆内存快照
    • 生成堆dump快照

      方式1:点击 监视-> 堆dump

      注意:这些快照存储在内存中,当线程停止的时候快照就会丢失,如果还想利用,可以将快照进行另存为

      JVM监控性能调优GUI篇(二)- Visual VM

      方式二:也可以在具体的pid上右键,dump

    • 读取堆dump快照

      点击 文件 ,选择 装入,文件格式选择 .hprof, 装载即可。

      JVM监控性能调优GUI篇(二)- Visual VM

      JVM监控性能调优GUI篇(二)- Visual VM

  • 查看JVM参数和系统属性
    • JVM参数

      点击 概述 , 查看 JVM参数信息,可以查看当前java 进程设置的JVM参数

      JVM监控性能调优GUI篇(二)- Visual VM
    • 系统属性

      点击 概述 , 查看 系统属性信息,可以查看系统相关属性和默认属性

  • 查看运行中的虚拟机进程
    • 点击监视查看,右上角勾选 进程,可事实查看虚拟机进程相关信息(活动、守护进程、峰值、已启动总数)

      JVM监控性能调优GUI篇(二)- Visual VM
  • 生成/读取线程快照
    • 生成线程快照

      方式一:点击线程, 再点击右上角的 线程dump,另外,此次存储也是在内存中的,如果想备份可以在快照里另存为。

      JVM监控性能调优GUI篇(二)- Visual VM

      JVM监控性能调优GUI篇(二)- Visual VM

      方式二:在具体的java进程中右击,保存为线程快照

    • 读取线程快照

      点击 文件 ,选择 装入,文件格式选择 .tdump, 装载即可。

    • 检测死锁

      下面是一个简单的线程死锁案例

      public static void main(String[] args) {
      
              StringBuilder s1 = new StringBuilder();
              StringBuilder s2 = new StringBuilder();
      
              new Thread() {
                  @Override
                  public void run() {
                      synchronized (s1) {
                          s1.append("a");
                          s2.append("1");
                          try {
                              Thread.sleep(100);
                          } catch (InterruptedException e) {
                              e.printStackTrace();
                          }
                          synchronized (s2) {
                              s1.append("b");
                              s2.append("2");
      
                              System.out.println(s1);
                              System.out.println(s2);
                          }
      
                      }
                  }
              }.start();
              new Thread(new Runnable() {
                  @Override
                  public void run() {
                      synchronized (s2) {
      
                          s1.append("c");
                          s2.append("3");
      
                          try {
                              Thread.sleep(100);
                          } catch (InterruptedException e) {
                              e.printStackTrace();
                          }
                          synchronized (s1) {
                              s1.append("d");
                              s2.append("4");
      
                              System.out.println(s1);
                              System.out.println(s2);
                          }
                      }
                  }
              }).start();
          }
      

      此时可以看到 检测到死锁标记

      JVM监控性能调优GUI篇(二)- Visual VM

      Dump 线程快照可以看到一下信息,线程Thread-1,线程 Thread-2处于阻塞状态

      JVM监控性能调优GUI篇(二)- Visual VM

      visual vm的检测结果

      JVM监控性能调优GUI篇(二)- Visual VM

  • 程序资源的实时监控
    • 对于CPU、堆内存、类装载情况、线程数的监控,提供了统一的监控模块;可以点击执行垃圾回收手动触发垃圾回收。

      JVM监控性能调优GUI篇(二)- Visual VM

  • 其他功能
    1. JMX代理连接
    2. 远程环境监控
    3. CPU分析和内存分析
    4. 可插拔插件(建议安装 Visual GC, Startup Profiler, BTrace Wrokbench)

JVM监控性能调优GUI篇(二)- Visual VM

上一篇:idea 创建多模块项目子模块为灰色


下一篇:批量注册项目使用gitlab-runner