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

一.使用jconsole

    jconsole是jdk自带的内置java性能分析器,用来监控Java应用程序的性能和跟踪Java中的代码;

    它有一个近亲,就是jvisualvm;

那么如何使用呢?

    1.很简单,在idea的命令行输入:

D:\java\workspace\AS> jconsole

就可显示出GUI:

182121_9wTB_3220575.png

这里有一个死锁演示代码:

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选择要查看的进程:

182312_50HV_3220575.png

这里可以看出,jconsole支持本地,也支持远程连接;

2.点击连接之后,进入主页面:

182502_thcD_3220575.png

左上角有几个tab,分别监控着不同的信息

182649_GRm2_3220575.png

3.查看线程死锁,选择线程tab,在最下面

182811_lhAO_3220575.png

有个检测死锁,点击:

183756_BAcw_3220575.png

这张图可以看到死锁信息,类名及方法名;

 

二.使用jstack

1.先用jps查看进程pid信息

101204_0cD8_3220575.png

2.使用jstack -l [pid]查看其中的线程信息

101702_Lnig_3220575.png

这里显示信息很多,不完全截图了... ...

101830_52kW_3220575.png

这里展示了  Found one Java-level deadlock:及具体的死锁信息展示;

三. 使用jvisualvm

        在(一)中我们介绍了jconsole的近亲jvisualvm,这里介绍一下;

        输入命令

jvisualvm

 会有如下信息展示,

   102953_lOt8_3220575.png

并显示GUI图像:

103124_Tl1t_3220575.png

左侧显示了当前的进程信息及pid,我们点击我们演示死锁的进程DealLock(pid:122168)

103255_zg3E_3220575.png

这里有一些当前进程信息展示,和jconsole的差不多,别的不多说了,直接点击线程:

103418_jl0a_3220575.png

可以看到提示检测到死锁,点击框框右侧的"线程Dump"按钮,展示所有线程信息,当看到最下面的时候:

104116_AmT7_3220575.png

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

 

 

 

转载于:https://my.oschina.net/JackieRiver/blog/1789476

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值