java 如何检测死锁_Java如何查看死锁

Java中当我们的开发涉及到多线程的时候,这个时候就很容易遇到死锁问题,刚开始遇到死锁问题的时候,我们很容易觉得莫名其妙,而且定位问题也很困难。

因为涉及到java多线程的时候,有的问题会特别复杂,而且就算我们知道问题出现是因为死锁了,我们也很难弄清楚为什么发生死锁,那么当我们遇到了死锁问题,我们应该如何来检测和查看死锁呢?

Java中jdk 给我们提供了很便利的工具,帮助我们定位和分析死锁问题:

1、死锁产生原因:当两个或者多个线程互相持有一定资源,并互相等待其他线程释放资源而形成的一种僵局,就是死锁。

2、构建一个死锁的场景:

public classTest {public static voidmain(String[] args) {new Thread(newRunnable() {

@Overridepublic voidrun() {synchronized (B.class) {try{

Thread.sleep(1000);

}catch(InterruptedException e) {

e.printStackTrace();

}synchronized (A.class) {

}

}

}

}).start();new Thread(newRunnable() {

@Overridepublic voidrun() {synchronized (A.class) {try{

Thread.sleep(1000);

}catch(InterruptedException e) {//TODO Auto-generated catch block

e.printStackTrace();

}synchronized (B.class) {

}

}

}

}).start();

}

}classA {

}classB {

}

可以看到运行时,一个线程持有A资源,希望使用B资源,而另一个线程持有B资源,希望使用A 资源,然后就陷入了相互等待的僵局,这样就形成了死锁。

进入java安装的位置,输入Jconsole,然后弹出界面(或者进入安装目录/java/jdk1.70_80/bin/,点击Jconsole.exe):

5b94aefd238e06cbebe80e59c07e0212.png

然后点击进入:

4f56b1a416ca6853aa08c4337c8a964d.png

然后点击检测死锁:

4bc70eb32be78f667795ee16834cbcb4.png

然后可以看到造成死锁的两个线程,以及死锁原因:

6f3e6da486f366182ab46b7abf1d0a34.png

Thread-0:持有java.lang.Class@1694ce18,需要java.lang.Class@1feb0edd,但是java.lang.Class@1feb0edd却被Thread-1持有,然后陷入等待。

10cfd73f6762ccdbfd25ffd4a3fcd309.png

Thread-1:持有java.lang.Class@1feb0edd,需要java.lang.Class@1694ce18,但是java.lang.Class@1694ce18却被Thread-0持有,然后陷入等待。

4、Jstack查看死锁:

同样,也是进入jdk安装目录的bin下面,输入jps,先查看我们要检测死锁的进程:

402f88037954231581eb367c314a2d2c.png

然后可以看到进程Test的进程号:8384,然后执行:Jstack -l 8384

21b09c9af75f0c41ff036e7865bd7736.png

查看死锁信息:

8e053597c25b57dbdef2439b9f53100f.png


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部