Java线程死锁查看分析方法

电脑杂谈  发布时间:2018-01-07 23:03:57  来源:网络整理

线程死锁的例子_线程死锁_c线程死锁的例子

如何查看是否有Java线程死锁?下面介绍两种方法。

一.Jconsole

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

连接到需要查看的进程。线程死锁

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

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

线程死锁的例子_线程死锁_c线程死锁的例子

从上图中我们可以看出:

程Thread-1中,从状态可以看出,它想申请java.lang.Object@35b4e829这个资源,但是这个资源已经被Thread-0拥有了,所以就堵塞了。

程Thread-0中,从状态可以看出,它想申请java.lang.Object@2db8dc9这个资源,但是这个资源已经被Thread-1拥有了,所以就堵塞了。

Thread-1一直等待java.lang.Object@35b4e829资源,而Thread–0一直等待java.lang.Object@2db8dc9资源,于是这两个线程就这么僵持了下去,造成了死锁。

二.Jstack

Jstack是JDK自带的命令行工具,主要用于线程Dump分析。

1.我们先用Jps来查看java进程id(或者Linux的ps命令)

2.看一下jstack的使用

c线程死锁的例子_线程死锁的例子_线程死锁

3.jstack输出线程dump信息到文件

用比较工程查看带-l和不带-l的区别如下:

4.查看dump文件,然后进行分析

其中有一行是at DeadThread.run(DeadThread.java:37),说明Thread-1实在DeadThread类的37行处发生死锁,其中at DeadThread.run(DeadThread.java:21),说明Thread-0是在DeadThread类的21行处发生死锁。详细的jstack dump文件分析请参看:。

从而定位到死锁发生的原因,及具体位置:Thread-0获得了锁lock1,接下来期望获得锁lock2,(第20行),但是此时Thread-1获得了锁lock2,接下来期望获得锁lock2,(第37行),因而发生了死锁。

附实例DeadThread.java代码:


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-58930-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 姬文婷
        姬文婷

        你看香港就是反面教材

      热点图片
      拼命载入中...