Java 死锁检查与快速确定位置

快速找到死锁位置

我们在写项目或者写程序的时候,可以会遇到死锁问题,但是这类错误却不好用一般情况查找,代码量很大或者不易察觉,这里介绍使用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行。

这样我们就完成了对死锁的检查与定位。

发布了25 篇原创文章 · 获赞 12 · 访问量 2910

猜你喜欢

转载自blog.csdn.net/ALone_cat/article/details/103809294