目录

  • 1. Jconsole
  • 1.1 Jconsole简介
  • 1.2 Jconsole常用功能
  • 2. VisualVM
  • 2.1 VisualVM简介
  • 2.2 安装插件
  • 3.总结



上篇文章我们一起学习了MAT工具的使用方式,除了第三方提供的JVM工具之外,JDK也自带了Jconsole和VisualVM,功能也都很强大;

1. Jconsole

1.1 Jconsole简介

JDK1.5开始新增的java监控和管理控制吧,它提供对JVM内存、线程和类的监控;

可以直接在java的安装目录,找到bin/jconsole.exe双击打开:

jvm线程数量监控 jvm查看线程运行状态_安装插件


首先选择你想要连接的java进程,点击连接;

jvm线程数量监控 jvm查看线程运行状态_JVM_02


包括一些堆、类、线程、CPU情况;

1.2 Jconsole常用功能

Jconsole的使用还是相对比较简单;通过Jconsole主要可以了解到堆、类、线程的情况;

1.2.1 内存信息

jvm线程数量监控 jvm查看线程运行状态_JVM_03


可以查看堆(Eden、S0、S1、Old)的使用情况,了解这些使用情况为你的JVM参数优化提供重要的参考指标;

1.2.2 线程信息
这块可以查看当前进程中开启的线程数量,以及检查线程之间是否存在死锁问题;
运行这段代码:

public class JconsoleTest {
    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread(new Lock1(),"线程A:");
        Thread thread2 = new Thread(new Lock2(),"线程B:");
        thread1.start();
        thread2.start();
    }
}
class Resource{
    // 对静态资源加锁,相当于是对class加锁;
    public static String resource1 = "lock1";
    public static String resource2 = "lock2";
}

class Lock1 implements Runnable{
    @Override
    public void run(){
        try{
            while(true){
                synchronized(Resource.resource1){
                    Thread.sleep(3000);
                    synchronized(Resource.resource2){
                        System.out.println("lock1获取资源2");
                    }
                }
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
class Lock2 implements Runnable{
    @Override
    public void run(){
        try{
            while(true){
                synchronized(Resource.resource2){
                    Thread.sleep(3000);
                    synchronized(Resource.resource1){
                        System.out.println("lock2获取资源1");
                    }
                }
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

jvm线程数量监控 jvm查看线程运行状态_安装插件_04


可以看出,线程A已经阻塞,想获取一个字符串,但被线程B占用;

2. VisualVM

2.1 VisualVM简介

VisualVM与Jconsole相比,VisualVM的功能更全面,并且它有比较好用的插件功能;

在java的安装目录下,找到 jvisualvm.exe 双击打开:

jvm线程数量监控 jvm查看线程运行状态_java_05


从这首页可以看出一些内存情况,选择线程,可以查看是否有死锁问题,如果有,点击生成 dump会生成一份dump文件;

jvm线程数量监控 jvm查看线程运行状态_安装插件_06

2.2 安装插件

感兴趣的同学可以安装一个插件:VisualGC,看一下功能图,你就会爱上它:

jvm线程数量监控 jvm查看线程运行状态_jvm线程数量监控_07


2.2.1 下载插件

下载地址:https://visualvm.github.io/pluginscenters.html2.2.2 安装插件

jvm线程数量监控 jvm查看线程运行状态_JVM_08

3.总结

通过上面的小例子,差不多就对这两款工具有了大致的了解,其它工作中真正用它的机会不多,并且工作中大部分都接入的有APM,但本地开发过程中遇到问题,拿出来排查个线程、JVM等相关问题,还是非常有帮助的;