JVM监控及诊断工具之JConsole以及Visual VM

一、图形化工具主要分为以下两类

1、JDK自带的工具

  • jconsole:JDK自带的可视化监控工具。查看Java应用程序的运行概况、监控堆信息、永久区(或元空间)使用情况、类加载情况等
  • Visual VM:VIsual VM是一个工具,它提供了一个可视界面,用于查看Java虚拟机上运行的基于Java技术的应用程序的详细信息。
  • JMC:Java Mission Control,内置Java Flight Recorder。能够以极低的性能开销收集Java虚拟机的性能数据。

2、第三方工具

  • MAT:MAT(Memory Analyzer Tool)是基于Eclipse的内存分析工具,是一个快速、功能丰富的Java heap分析工具,它可以帮助我们查找内存泄露和减少内存消耗
  • JProfiler:商业软件,需要付费。功能强大

二、 JConsole

1、简介

        jconsole:从Java5开始,在JDK自带的Java监控和管理控制台。用于对JVM中内存、线程和类等的监控,是一个基于JMX(java management extensions)的GUI性能监控工具。

2、测试新建的程序

package com.kgf.kgfjavalearning2021.jvm.jconsole;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/***
 *  -Xms600m -Xmx600m -XX:SurvivorRatio=8
 */
public class HeapInstanceTest {

    byte[] buffer = new byte[new Random().nextInt(1024*100)];

    public static void main(String[] args) {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        List<HeapInstanceTest> list = new ArrayList<>();
        while (true){
            list.add(new HeapInstanceTest());
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

在idea中配置环境变量:

然后启动程序

3、打开cmd窗口,并且使用jconsole命令打开GUI界面(因为配置了jdk的环境变量)

 

 可以看到上面我们选择本地进程中的进程,然后点击连接

 进入后看到如下的界面:

 

 

 4、使用jconsole检测死锁程序

  下面我们创建一个死锁的程序:

package com.kgf.kgfjavalearning2021.jvm.command;

/***
 * 测试线程间的死锁问题
 */
public class JstackLockTest {


    public static void main(String[] args) {

        StringBuilder sb1 = new StringBuilder();
        StringBuilder sb2 = new StringBuilder();

        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (sb1){
                    sb1.append("a");
                    sb2.append("1");
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (sb2){
                        sb1.append("b");
                        sb2.append("2");
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (sb2){
                    sb1.append("c");
                    sb2.append("3");
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (sb1){
                        sb1.append("d");
                        sb2.append("4");
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }).start();

    }
}

 


三、Visual VM

1、简介

Visual VM是一个功能强大的多合一故障诊断和性能监控的可视化工具。它集成了多个JDK命令行工具,使用Visual VM可用于显示虚拟机进程及进程的配置和环境信息(jps,jinfo),监视应用程序的CPU、GC、堆、方法区及线程的信息(jstat、jstack)等,甚至代替JConsole。在JDK6 Update 7以后,Visual VM便作为JDK的一部分发布(VisualVM在JDK/bin目录下)即:它完全免费

主要功能

  • 1.生成/读取堆内存/线程快照
  • 2.查看JVM参数和系统属性
  • 3.查看运行中的虚拟机进程
  • 4.程序资源的实施监控
  • 5.JMX代理连接、远程环境监控、CPU分析和内存分析

官方地址:VisualVM: Home

使用:

      在jdk安装目录中找到jvisualvm.exe,然后双击执行即可 打开DOS窗口,输入jvisualvm就可以打开该软件

插件的安装:

在这里插入图片描述

 在这里插入图片描述

1)、首先在IDEA中搜索VisualVM Launcher插件并安装:

在这里插入图片描述

2)、 重启IDEA,然后配置该插件 

在这里插入图片描述

3)、 使用两种方式来运行程序

在这里插入图片描述

 4)、 运行效果 还是打开jvisualvm界面,只是不需要我们手动打开jvisualvm而已

 5)、连接方式

         5.1)、本地连接
                  监控本地Java进程的CPU、类、线程等

         5.2)、远程连接
                  5.2.1、确定远程服务器的ip地址
                  5.2.2、添加JMX(通过JMX技术具体监控远程服务器哪个Java进程)
                  5.2.3、修改bin/catalina.sh文件,连接远程的tomcat
                  5.2.4、在…/conf中添加jmxremote.access和jmxremote.password文件
                  5.2.5、将服务器地址改成公网ip地址
                  5.2.6、设置阿里云安全策略和防火墙策略
                  5.2.7、启动tomcat,查看tomcat启动日志和端口监听
                  5.2.8、JMX中输入端口号、用户名、密码登录       

    

2、主要功能

2.1、测试程序

package com.kgf.kgfjavalearning2021.jvm.visualvm;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/***
 * -Xms600m -Xmx600m -XX:SurvivorRatio=8
 */
public class VisualVMTest {

    public static void main(String[] args) {

        List<Object> list = new ArrayList<>();
        while (true){
            try {
                Thread.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            list.add(new Picture(new Random().nextInt(100*50)));
        }
    }
}

class Picture{

    private byte[] pixels;

    public Picture(int length) {
        this.pixels = new byte[length];
    }
}

配置环境变量:

 2.2、使用idea上安装的visualvm插件直接启动程序

 

2.3、生成堆内存快照

2.3.1、方式1:

 2.3.2、方式2:

2.4、注意: 生成堆内存快照如下图: 

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

2.5、 装入堆内存快照 

 查看hprof详细信息:

 可以双击进入查看类里面具体信息:

3、使用visualvm检测JstackLockTest.java程序的死锁问题

package com.kgf.kgfjavalearning2021.jvm.command;

/***
 * 测试线程间的死锁问题
 */
public class JstackLockTest {


    public static void main(String[] args) {

        StringBuilder sb1 = new StringBuilder();
        StringBuilder sb2 = new StringBuilder();

        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (sb1){
                    sb1.append("a");
                    sb2.append("1");
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (sb2){
                        sb1.append("b");
                        sb2.append("2");
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (sb2){
                    sb1.append("c");
                    sb2.append("3");
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (sb1){
                        sb1.append("d");
                        sb2.append("4");
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }).start();

    }
}

 我们生成dump文件看看:


4、Visual VM的CPU抽样和内存抽样

4.1、测试代码:

package com.kgf.kgfjavalearning2021.jvm.visualvm;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/***
 * -Xms600m -Xmx600m -XX:SurvivorRatio=8
 */
public class VisualVMTest {

    public static void main(String[] args) {

        List<Object> list = new ArrayList<>();
        while (true){
            try {
                Thread.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            list.add(new Picture(new Random().nextInt(100*50)));
        }
    }
}

class Picture{

    private byte[] pixels;

    public Picture(int length) {
        this.pixels = new byte[length];
    }
}

4.2、启动程序,打开visualvm监控热点方法

过滤功能

 cpu快照

 

4.3、内存堆柱状图

 4.4、每个线程分配

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值