检查java线程死锁的几种方法

一.使用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"按钮,展示所有线程信息,当看到最下面的时候:

这里是不是眼熟,不用再说了吧.... ....

猜你喜欢

转载自my.oschina.net/u/3220575/blog/1789476