当前位置: 首页 > ai >正文

JConsole:Java监视与管理控制台

文章目录

  • JConsole:Java监视与管理控制台
    • JConsole启动
    • 内存监控
    • 线程监控
      • 线程死循环
      • 线程等待
      • 线程死锁
    • 类监控
    • VM概要

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获取到了锁lockBThread.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性能和使用情况。

在这里插入图片描述

http://www.xdnf.cn/news/11282.html

相关文章:

  • 逆向与反汇编实战(一)--PEiD分析复现
  • RIP的基本原理及配置
  • Unity官方本地化插件localization
  • 【easyui】之DataGrid数据显示
  • Java基础知识总结(超详细整理),你会的还只有初级工程师的技术吗
  • 基于CMOS技术,CMOS工艺等,CMOS到底是个啥?
  • Intel IPP图像库手册函数概述
  • 【Qt】界面定制艺术:光标(cursor)、字体(font)、提示(toolTip)、焦点(focusPolicy)与样式表(styleSheet)的深度探索
  • MCU最强科普总结~
  • RecyclerView完全解读
  • 100个linux系统的常用命令【建议收藏】
  • Java学习之JavaWeb篇
  • 利用python进行数据分析——使用groupby机制对pandas对象类的数据进行聚合与分组操作
  • “权限”用英语该用哪个?
  • 学了那么久的java你还不明白HelloWorld的原理吗?速看!
  • 强!推荐一款自动化神器Autolt:不再重复工作
  • linux基础(超级详细小白入门篇)
  • 2024年最新source insight教程:常用设置、快捷键、附带source insight3,Golang面试知识点
  • fseek 、fwrite 、fread
  • 检测UDP端口是否畅通方法
  • IOU、GIOU、DIOU、CIOU的学习及代码实现
  • 灰度图的理解(主要在作图像的方面遇到了问题)
  • 如何选择美国高速VPS?实用选购指南
  • SPL - 写着简单跑得又快的数据库语言
  • 数据结构与算法入门
  • node.js详细安装教程
  • 常见中文乱码问题
  • DB2备份和还原数据库+代码详解
  • HTTP/HTTPS(超细精讲)
  • 彻底理解面向对象,看完这一篇就够了