JConsole:Java监视与管理控制台

Posted zqq_hello_world

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JConsole:Java监视与管理控制台相关的知识,希望对你有一定的参考价值。

JConsole:Java监视与管理控制台

JConsole(Java Monitoring and Management Console)是一款基于JMX(Java Manage-ment
Extensions)的可视化监视管理工具,用于连接正在运行的Jvm,可以对虚拟机内存线程类加载情况CPU占用率等进行监控。

在这里插入图片描述

JConsole启动

  • Jsonsole位置在${JAVA_HOME}\\bin\\jconsole.exe,点击运行。

  • Windows—cmd窗口输入命令:jconsole

运行后会自动搜索本机运行中的Java进程(相当于jps命令)。选中一个进程进入主界面开始监控
在这里插入图片描述

内存监控

JConsole内存监控相当于可视化的jstat命令,用于监视被收集器管理的虚拟机内存。可以看到堆内存的变化(创建对象和发送GC产生的内存变化),和新生代的内存变化,可以用于监控内存使用情况。详细信息中会列出内存的一些基本信息。
在这里插入图片描述

线程监控

JConsole线程监控相当于可视化的jstack命令,遇到线程停顿时可以用JConsole线程监控进行分析。

线程死循环

public static void main(String[] args) throws Exception{
    Thread.sleep(10 * 1000);//10s后运行,打开JConsole线程监控
    demo1();
}

/**
 * 线程死循环
 */
private static void demo1() {
    new Thread(()->{
        while (true){
        }
    },"thread_1").start();
    new Thread(()->{
        try {
            Thread.sleep(3 * 1000);
            System.out.println("线程:"+ Thread.currentThread().getName());
        }catch (Exception e){}
    },"thread_2").start();
}

在这里插入图片描述

运行代码进行线程监控,线程thread_2运行完就结束了,而线程thread_1一直处理RUNNABLE状态,并且一直在运行代码22行(死循环代码)。Java线程是抢占式的,系统会分配给每个线程一定的执行时间,当执行时间结束就会切换到其它线程,这里死循环会耗尽自己的时间后切换到其他线程,当切回当前线程继续循环切换,会消耗大量的处理器资源。

线程等待

public static void main(String[] args) throws Exception{
    Thread.sleep(10 * 1000);
    demo2();
}

/**
 * 线程等待
 */
private static void demo2() throws Exception{
    new Thread(() ->{
        threadWait();
    },"wait_thread").start();
    //睡2秒保证线程wait_thread等待释放锁后,线程while_thread获取锁进入
    Thread.sleep(2 * 1000);
    new Thread(() ->{
        threadWait();
    },"while_thread").start();
}

private synchronized static void threadWait(){
    //当线程wait_thread进来时,调用锁对象的wait()方法使线程进入等待,释放线程锁
    if("wait_thread".equals(Thread.currentThread().getName())){
        try {
            Demo.class.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    //线程while_thread一直循环
    while (true){
    }
}

在这里插入图片描述

用JConsole线程监控可以看到正在等待的线程,状态是WAITING,并给出锁对象,和正拥有锁的线程。可以调用锁对象的notify()方法(在该锁锁定的同步代码块中调用)随机唤醒一条线程或者notifyAll()唤醒全部线程(唤醒后继续去抢占CPU调度)。

线程死锁

public static void main(String[] args) throws Exception{
    Thread.sleep(10 * 1000);
    demo3();
}

/**
 * 创建A锁,lockA
 */
private static final Object lockA = new Object();

/**
 * 创建B锁,lockB
 */
private static final Object lockB = new Object();

/**
 * 线程死锁
 */
private static void demo3() {
    new Thread(() ->{
        synchronized (lockA){
            try {
                //线程睡眠2秒,让出cpu确保线程Thread_B获取到了锁lockB
                Thread.sleep(2 * 1000);
                synchronized (lockB){
                    System.out.println("线程:" + Thread.currentThread().getName());
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    },"Thread_A").start();
    new Thread(() ->{
        synchronized (lockB){
            try {
                Thread.sleep(2 * 1000);
                synchronized (lockA){
                    System.out.println("线程:" + Thread.currentThread().getName());
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    },"Thread_B").start();
}

在这里插入图片描述

JConsole线程监控可以很简单快速轻松的发现代码中死锁的情况,锁状态为BLOCKED。如图,并有检测死锁按钮来搜索死锁的线程,通过堆栈跟踪可以很清楚的看到死锁的锁对象死锁线程的代码位置

类监控

JConsole可以监控到某个时间段内加装类的数量、总数、已卸载类总数。

在这里插入图片描述

VM概要

JConsole可以查看当前运行虚拟机环境的一些概要信息。方便分析JVM性能和使用情况。

在这里插入图片描述

以上是关于JConsole:Java监视与管理控制台的主要内容,如果未能解决你的问题,请参考以下文章

Java 自带性能监控工具:监视和管理控制台 jconsole 的使用

《深入理解Java虚拟机》JVM调优 - 工具

监控小工具(jconsole)

jvm 图形化工具之jconsole

Java 性能优化

监控管理