1 JConsole作用
查看Java应用程序的运行概况,监视垃圾收集器管理的虚拟机内存(堆和元空间)的变化趋势,以及监控程序内的线程。
2 使用说明
代码如下:
package com.example.demo;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class jconsoletest {
public static void main(String[] args) throws IOException, InterruptedException {
Thread.sleep(5000);
System.out.println("start...");
test1(10000);
System.in.read();
}
public static void test1(int num) throws InterruptedException {
final int _128K = 128 * 1024; //128k
List<byte[]> list = new ArrayList<byte[]>();
for (int i = 0; i < num; i++) {
//稍作延时,令监视曲线的变化更加明显
Thread.sleep(100);
list.add(new byte[_128K]);
}
}
}
启动JConsole,在控制台输入:jconsole即可,在弹出的界面中,选择本地进程,然后进去看界面页签信息。
显示的是整个虚拟机主要运行数据的概览,其中包括堆内存使用情况,线程,类,CPU使用情况四项信息的曲线图。
(1)内存
相当于命令行的jstat命令,用于监视受垃圾收集器管理的虚拟机内存(堆和元空间)的变化趋势,这不仅是包括堆内存的整体信息,更细化到伊甸区、幸存区、老年代的使用情况。同时,也包括非堆区,即元空间的使用情况,单机界面右上角的“执行GC”按钮,可以强制应用程序进行一次Full GC。
(2)线程
相当于命令行的jstack命令,遇到线程停顿的时候可以使用它来进行监控分析。JConsole 显示了系统内的线程数量,并在屏幕下方,显示了程序中所有的线程。单击线程名称,便可以查看线程的栈信息。
(3)类
如图所示,显示了系统以及装载的类数量。在详细信息栏中,还显示了已卸载的类数量。
(4)VM摘要
在VM摘要页面,JConsole 显示了当前应用程序的运行环境。包括虚拟机类型、版本、堆信息以及虚拟机参数等。相当于jinfo命令
(5)MBean
MBean页面允许通过JConsole访问已经在MBean服务器注册的MBean对象。
3 示例
3.1 代码如下
package com.example.demo;
import java.io.IOException;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class jconsoletest2 {
public static void main(String[] args) throws IOException {
System.in.read();
System.out.println("开启了死循环线程");
whileTrueThread();
System.in.read();
System.out.println("开启了等待线程");
waitThread(new Object());
System.in.read();
System.out.println("开启了死锁线程");
deadLock();
System.in.read();
}
private static void whileTrueThread() {
new Thread(() -> {
while (true) ;
}, "whileTrueThread").start();
}
private static void waitThread(Object o) {
new Thread(() -> {
synchronized (o) {
try {
o.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"myWaited").start();
}
private static void deadLock() {
Lock lock1 = new ReentrantLock();
Lock lock2 = new ReentrantLock();
new Thread(() -> {
try {
lock1.lock();
Thread.sleep(100);
lock2.lock();
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "myThread1").start();
new Thread(() -> {
try {
lock2.lock();
Thread.sleep(100);
lock1.lock();
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "myThread2").start();
}
}
启动后点击以一个回车,进入死循环代码:
jconsole中发现cpu飚高。
点击第二个回车,进入等待线程代码。
jconsole中查看线程等待信息:
第三个回车,进入死锁代码,
jconsole查看该代码死锁情况: