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性能和使用情况。

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
通过这个错误信息可以看出,您的项目中无法解析 com.sun:jconsole:1.8 这个依赖项。 首先,需要确认您的项目中是否有该依赖的正确引用。您可以在项目的构建文件中(如pom.xml或build.gradle)查找是否存在以下类似代码: Maven的pom.xml文件: ```xml <dependency> <groupId>com.sun</groupId> <artifactId>jconsole</artifactId> <version>1.8</version> </dependency> ``` Gradle的build.gradle文件: ```groovy dependencies { implementation 'com.sun:jconsole:1.8' } ``` 如果没有找到上述代码,说明项目中确实没有引入该依赖,您需要手动添加该依赖项。 如果项目中已经正确引用了该依赖项,那么有可能是您当前使用的依赖库无法解析该依赖。您可以尝试更新您当前使用的构建工具、库或框架的版本,以获取对 com.sun:jconsole:1.8 的支持。 另外,由于 com.sun:jconsole:1.8 是 Oracle 提供的 Java 监视管理控制台,它通常包含在 JDK 中,而不是通过 Maven 或 Gradle 中央仓库提供。所以,如果您使用的是 OpenJDK,而不是Oracle JDK,那么可能无法访问到该依赖项。您可以尝试切换到Oracle JDK来解决该问题。 综上所述,不能解析 com.sun:jconsole:1.8 通常是因为项目中没有正确引用该依赖,或者当前使用的构建工具、库或框架无法解析该依赖。您可以尝试手动添加该依赖或更新相关工具版本,以及检查您使用的JDK类型是否与该依赖相关。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值