java 如何检测死锁_Java多线程 - 怎么检测到发生死锁?

1-Jconsole 检查死锁

Jconsole是JDK自带的图形化界面工具,使用JDK给我们的的工具JConsole,可以通过打开cmd然后输入jconsole打开。

6e493d675cf3468e65d760c2e2a46735.png

连接到需要查看的进程。

cda6dae5a73d509de02ffc0751ba5fa3.png

打开线程选项卡,然后点击左下角的“检测死锁” 。

d970dd8d7906202b8889645b0edcdd9f.png

jconsole就会给我们检测出该线程中造成死锁的线程,点击选中即可查看详情:

dd88aaa06ce6651b2b5de76a62440adf.png

651186b8ee1817225bc825b066f3041b.png

从上图中我们可以看出:

在线程Thread-1中,从状态可以看出,[email protected],但是这个资源已经被Thread-0拥有了,所以就堵塞了。

在线程Thread-0中,从状态可以看出,[email protected],但是这个资源已经被Thread-1拥有了,所以就堵塞了。

2-VisualVM

1.从线程图中,我们可以很轻易地找到这种可疑特征:两个(或多个)线程长期同时处于”监视(被阻塞)”状态,提示“检查到死锁”说明它们出现了死锁,应当生成dump查到详细内容。

2.生成dump后,在dump的最下面有关于锁的说明

c64a590844fc517eb2ee490dec020a5f.png

3-自行维护一个graph来记录申请锁情况

每当一个线程获得了锁,会在线程和锁相关的数据结构中(map、graph等等)将其记下。除此之外,每当有线程请求锁,也需要记录在这个数据结构中。

当一个线程请求锁失败时,这个线程可以遍历锁的关系图看看是否有死锁发生。例如,线程A请求锁7,但是锁7这个时候被线程B持有,这时线程A就可以检查一下线程B是否已经请求了线程A当前所持有的锁。如果线程B确实有这样的请求,那么就是发生了死锁。

原文:https://www.cnblogs.com/frankcui/p/14370515.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值