死锁的排查工具之jstack、jconsole、jvisualvm

目录

死锁的产生

死锁的排查工具

1.jstack

2.jconsole

3.jvisualvm


死锁的产生

锁是个非常有用的工具,运用场景很多,因为使用起来既简单又易于理解。但是它也会带来一些困扰,那就是会引起死锁,一旦产生死锁,就会造成系统功能不可用。

先来看一段代码,线程A和线程B互相等待对方释放锁。

package com.example.demo.deadlock;

public class LockDemo {

    private static final Object A = new Object();
    private static final Object B = new Object();

    public static void main(String[] args) {
        new Thread(()->{
            synchronized (A){
                System.out.println("Tom获得锁");
                try {
                    Thread.sleep(50L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (B){
                    System.out.println("Tom抓到了Jerry");
                }
            }
        }).start();

        new Thread(()->{
            synchronized (B){
                System.out.println("Jerry获得锁");
                synchronized (A){
                    System.out.println("Jerry甩掉了Tom");
                }
            }
        }).start();
    }

}

代码的执行结果为:

由此可以明显看出,程序没有结束,AB都在等对方释放资源,这就产生了死锁问题。

那么问题来了?

如何排查死锁?这里我只介绍3个,其余的就自行了解吧~因为我没了解

  1. jstack
  2. jconsole
  3. jvisualvm

死锁的排查工具

1.jstack

先来说jstack,在这之前,我们首先打开cmd输入jps,即可看到java的运行程序进程id。找到自己的程序,我的就是22064。然后输入jstack 22064,就可以看到一大段代码。

 这里就可以清楚的看到,我们的线程是死锁状态。

那有的人就说了,你这啥啊一堆黑黢黢的,一点也不直观。

好的,直观的咱也整一个。

2.jconsole

废话不多说,直接cmd执行jconsole就会出现jconsole控制台,如下图所示。除了这个方法,也可以打开 JDK 的 bin 目录,找到 jconsole 并双击打开,因为jconsole是jdk自带的一套java虚拟机执行状况监视器,能够用来监控虚拟机的内存、线程、cpu使用情况等。这里就不说别的了,我是用cmd打开的。

 点击连接进入,选择“不安全的连接”进入监控主页,即可看到如下图所示:

 选择线程标签,在底部可以看到有“检测死锁”的按钮,点击后就会将死锁的进程显示出来。

3.jvisualvm

jvisualvm也是jdk自带的性能分析工具,在bin目录下,所以打开方式也是直接在bin目录中找到,双击打开即可。

jvisualvm可以监控本地,远程的java进程,实时查看进程的cpu、线程等参数,对java程序生成dump文件,并对dump文件进行分析。

 双击左侧要调试的程序,在右边选择线程,即可看到检测出死锁的提示。

 我们可以通过线程Dump来查看是哪个线程出现了问题,以下线程信息告诉我们是LockDemo类的第27行和第18行引起的死锁。

 那么以上,就讲解了三种排查工具的使用,欢迎补充~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值