zoukankan      html  css  js  c++  java
  • JVM监控性能调优GUI篇(二)- Visual VM

    概述

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

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

    安装

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

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

      3. 点击启动按钮,再选择具体的java进程即可

    • JDK自带

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

    连接方式

    • 本地连接

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

    • 远程连接
      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

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

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

      • 读取堆dump快照

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

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

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

      • 系统属性

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

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

    • 生成/读取线程快照
      • 生成线程快照

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

        方式二:在具体的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();
            }
        

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

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

        visual vm的检测结果

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

    • 其他功能
      1. JMX代理连接
      2. 远程环境监控
      3. CPU分析和内存分析
      4. 可插拔插件(建议安装 Visual GC, Startup Profiler, BTrace Wrokbench)
  • 相关阅读:
    HTML技巧: 语义化你的代码
    css sprite
    Redis主从复制原理
    idea修改快捷键
    Ubuntu14.20 安装docker,创建centos6.7容器,并访问centos容器
    [转]SQL 中 with as 的用法
    ftp与sftp及sftp和scp的区别
    Linux top 命令
    Linux free 命令
    ubuntu 源方式 安装jdk
  • 原文地址:https://www.cnblogs.com/worldline/p/15211589.html
Copyright © 2011-2022 走看看