JDK提供的可视化工具主要有JConsole和VirtualVM。
JConsole(Java Monitoring and Management Console)是一个基于JMX(Java Management Extensions,即Java管理扩展)的可视化监视、管理工具。 管理部分是针对JMX MBean进行管理。
界面如下,可以看到包括概述,内存,线程,类,VM概要和MBean:
概述包括整个虚拟机主要运行数据的概览,包括“堆内存使用情况”,“线程”,“类”,“CPU使用情况”。
内存页相当于jstat,用于监视收集器管理的虚拟机内存(Java堆和永久代)变化趋势。 以如下代码为例:
/**
*-Xms100m -Xmx100m -XX:+UseSerialGC
*/
public class JConsoleTest {
static class OOMObject {
public byte[] placeholder = new byte[64 * 1024];
}
public static void fillHeap(int num) throws InterruptedException {
List<OOMObject> list = new ArrayList<>();
for (int i = 0; i < num; i++) {
Thread.sleep(50);
list.add(new OOMObject());
}
System.gc();
}
public static void main(String[] args) throws Exception {
fillHeap(1000);
}
}
可以观察到JConsole监控到的情况为:
相当于jstack命令,线程停顿可以用这个标签页进行监控分析。 以如下代码为例:
private static void fillHeap(int num) throws InterruptedException {
List<OOMObject> list = new ArrayList<>();
for (int i = 0; i < num; i++) {
Thread.sleep(50);
list.add(new OOMObject());
}
System.gc();
}
public static void createBusyThread() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
;
}
}
}, "testBusyThread");
thread.start();
}
public static void creatLockThread(final Object lock) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}, "testLockThread");
thread.start();
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
br.readLine();
createBusyThread();
br.readLine();
Object obj = new Object();
creatLockThread(obj);
}
RUNNABLE 的main线程
Runnable的testBusyThread 3.testLockThread线程等待lock对象的notify或者notifyAll方法。处于WAITING状态:
waiting的testLockThread.png
static class SycnAddRunnable implements Runnable {
int a, b;
public SycnAddRunnable(int a, int b) {
this.a = a;
this.b = b;
}
@Override
public void run() {
synchronized (Integer.valueOf(a)) {
synchronized (Integer.valueOf(b)) {
System.out.println(a + b);
}
}
}
}
public static void main(String[] args) {
for (int i = 0; i < 1000; i++) {
new Thread(new SycnAddRunnable(1, 2)).start();
new Thread(new SycnAddRunnable(2, 1)).start();
}
}
检测到死锁
强大的运行监视和故障处理程序。