一.使用jconsole
jconsole是jdk自带的内置java性能分析器,用来监控Java应用程序的性能和跟踪Java中的代码;
它有一个近亲,就是jvisualvm;
那么如何使用呢?
1.很简单,在idea的命令行输入:
D:\java\workspace\AS> jconsole
就可显示出GUI:
这里有一个死锁演示代码:
package com.river.morethread;
public class DealLock implements Runnable{
public String username;
public Object lockOne = new Object();
public Object lockSecond = new Object();
public void serFlag(String username){
this.username = username;
}
@Override
public void run() {
if ("a".equals(username)){
synchronized (lockOne){
try {
System.out.println("username -> " + username);
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockSecond){
System.out.println("lockOne -> lockSecond");
}
}
}
if ("b".equals(username)){
synchronized (lockSecond){
try {
System.out.println("username -> " + username);
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockOne){
System.out.println("lockSecond -> lockOne");
}
}
}
}
public static void main(String[] args) throws InterruptedException {
DealLock d1 = new DealLock();
d1.serFlag("a");
new Thread(d1).start();
Thread.sleep(100);
d1.serFlag("b");
new Thread(d1).start();
}
}
因此Gui选择要查看的进程:
这里可以看出,jconsole支持本地,也支持远程连接;
2.点击连接之后,进入主页面:
左上角有几个tab,分别监控着不同的信息
3.查看线程死锁,选择线程tab,在最下面
有个检测死锁,点击:
这张图可以看到死锁信息,类名及方法名;
二.使用jstack
1.先用jps查看进程pid信息
2.使用jstack -l [pid]查看其中的线程信息
这里显示信息很多,不完全截图了... ...
这里展示了 Found one Java-level deadlock:及具体的死锁信息展示;
三. 使用jvisualvm
在(一)中我们介绍了jconsole的近亲jvisualvm,这里介绍一下;
输入命令
jvisualvm
会有如下信息展示,
并显示GUI图像:
左侧显示了当前的进程信息及pid,我们点击我们演示死锁的进程DealLock(pid:122168)
这里有一些当前进程信息展示,和jconsole的差不多,别的不多说了,直接点击线程:
可以看到提示检测到死锁,点击框框右侧的"线程Dump"按钮,展示所有线程信息,当看到最下面的时候:
这里是不是眼熟,不用再说了吧.... ....