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

Posted 爱上口袋的天空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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、每个线程分配

 

以上是关于JVM监控及诊断工具之JConsole以及Visual VM的主要内容,如果未能解决你的问题,请参考以下文章

JVM监控诊断之工具使用(上篇)

JVM监控诊断之工具使用(上篇)

JVM监控诊断之工具使用(上篇)

JVM监控诊断之工具使用(上篇)

JVM监控及诊断工具之Eclipse MAT

JVM监控及诊断工具-命令之jstat