Java死锁检测方式之JConsole
我们在开发中应该尽量避免死锁,但是如果真的有死锁产生那么我们怎么在一个复杂的项目中快速的找到死锁产生的原因呢?
我大概总结了一下常用的几种方式:
-
使用JConsole
在我们的JAVA_HOME/bin目录下我们可以找到一个jdk提供的虚拟机监控工具叫Jconsole,双击打开连接你要查找的虚拟机进程,如图:
jconsole1.jpg
进入监控界面后点击左下角的检测死锁会检测出死锁的线程,点击具体的线程可以看到如下图死锁相关信息.
jconsole2.jpg
比如下图所示,我们可以看到
名称: B //发生死锁的线程名称
状态: java.lang.Object@6b0eb7ca上的BLOCKED, 拥有者: A //线程B正在等待的锁, 被线程A所持有
总阻止数: 1, 总等待数: 1
堆栈跟踪:
test.B.run(TestThread.java:56) //该死锁发生在TestThread.java文件的第56行
- 已锁定 java.lang.Object@6cf3ef8 //线程B持有的锁
这是的发生死锁的线程A的信息:
名称: A
状态: java.lang.Object@6cf3ef8上的BLOCKED, 拥有者: B //线程A正在等待的锁, 被线程B所持有
总阻止数: 1, 总等待数: 1
堆栈跟踪:
test.A.run(TestThread.java:33)
- 已锁定 java.lang.Object@6b0eb7ca //线程A持有的锁
根据此信息我们可以快速定位到死锁发生的位置和锁对象,以及和其相关的线程从而解决问题
网友评论