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监视与管理控制台的主要内容,如果未能解决你的问题,请参考以下文章