1-Jconsole 检查死锁
Jconsole是JDK自带的图形化界面工具,使用JDK给我们的的工具JConsole,可以通过打开cmd然后输入jconsole打开。
连接到需要查看的进程。
打开线程选项卡,然后点击左下角的“检测死锁” 。
jconsole就会给我们检测出该线程中造成死锁的线程,点击选中即可查看详情:
从上图中我们可以看出:
在线程Thread-1中,从状态可以看出,[email protected],但是这个资源已经被Thread-0拥有了,所以就堵塞了。
在线程Thread-0中,从状态可以看出,[email protected],但是这个资源已经被Thread-1拥有了,所以就堵塞了。
2-VisualVM
1.从线程图中,我们可以很轻易地找到这种可疑特征:两个(或多个)线程长期同时处于”监视(被阻塞)”状态,提示“检查到死锁”说明它们出现了死锁,应当生成dump查到详细内容。
2.生成dump后,在dump的最下面有关于锁的说明
3-自行维护一个graph来记录申请锁情况
每当一个线程获得了锁,会在线程和锁相关的数据结构中(map、graph等等)将其记下。除此之外,每当有线程请求锁,也需要记录在这个数据结构中。
当一个线程请求锁失败时,这个线程可以遍历锁的关系图看看是否有死锁发生。例如,线程A请求锁7,但是锁7这个时候被线程B持有,这时线程A就可以检查一下线程B是否已经请求了线程A当前所持有的锁。如果线程B确实有这样的请求,那么就是发生了死锁。
原文:https://www.cnblogs.com/frankcui/p/14370515.html