快速找到死锁位置
我们在写项目或者写程序的时候,可以会遇到死锁问题,但是这类错误却不好用一般情况查找,代码量很大或者不易察觉,这里介绍使用JDK自带的Java VisualVM 快速定位死锁位置。
首先,这里写了一个死锁代码来演示如何查询死锁位置:
public class DeadLock {
private static Object o1 = new Object();
private static Object o2 = new Object();
public static void main(String[] args) {
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (o1){
System.out.println("Thread1 get o1");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2){
System.out.println("Thread1 get o2");
}
}
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (o2){
System.out.println("Thread2 get o2");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o1){
System.out.println("Thread2 get o1");
}
}
}
});
thread1.start();
thread2.start();
}
}
运行起来,让其死锁:
然后打开Java VisualVM ,路径如下:
运行
可以在左侧看到刚刚测试死锁运行的程序:DeadLock,点击进入:
点击线程,可以看到提示信息,告诉我们这个进程发生了死锁
然后我们点击Dump,即对进程进行一次快照
这里详细的显示了该进程Dump时刻的各个线程的信息
我们可以拉到下面,发现如下信息:
这里很清晰的可以看到,系统提示发生了一个Java级的死锁,分别是名为Thread-1和Thread-0的线程发生了死锁,并且可以定位到具体的代码位置:分别是22行和39行。
这样我们就完成了对死锁的检查与定位。