关闭

Java如何查看死锁?

标签: jdk死锁查看jconsolejstack
3079人阅读 评论(0) 收藏 举报
分类:

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

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

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

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

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

public class Test {

	public static void main(String[] args) {
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				synchronized (B.class) {
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					synchronized (A.class) {
						
					}
				}
			}
		}).start();
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				synchronized (A.class) {
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					synchronized (B.class) {
						
					}
				}
				
			}
		}).start();
	}
	
}
class A {
	
}

class B {
	
}

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

3、Jconsole查看死锁

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


然后点击进入:


然后点击检测死锁:


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


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


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

4、Jstack查看死锁:

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


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


查看死锁信息:


0
0
查看评论

死锁的检测和解除

死锁的检测和解除
  • sinat_22055459
  • sinat_22055459
  • 2016-05-19 15:55
  • 3079

死锁怎么检测?

先OO分析、建模,再研究具体问题。这里面涉及的对象: 1)线程 2)锁 关系: 占有:线程——锁 的一对多关系:一个线程可以占有多个锁,一个锁只能被一个线程占有 等待:线程——锁 的多对多关系:一个线程可以等待多个锁,一个锁可以被多个线程等待 间接等待关系 线程——线程 的多对多关系,一个线程A等待...
  • binling
  • binling
  • 2015-10-09 15:51
  • 1655

【JAVA 工具】jstack简单使用,定位死循环、线程阻塞、死锁等问题

转载地址:http://www.cnblogs.com/chenpi/p/5377445.html 当我们运行java程序时,发现程序不动,但又不知道是哪里出问题时,可以使用JDK自带的jstack工具去定位; 废话不说,直接上例子吧,在window平台上的; 死循环 写个死循环的程...
  • wanglha
  • wanglha
  • 2016-04-12 15:24
  • 7242

线程死锁及如何使用JDK自带工具监测是否有死锁现象

Java线程死锁原因:不同线程都在等待根本不可能被释放的锁,从而导致所有的任务都无法继续完成。举个栗子:两个线程互相等待对方释放锁。/** * Created by LZF on 2017/7/14. * 学习:如何查看多线程死锁 */ class DealThread implement...
  • u011296485
  • u011296485
  • 2017-07-14 16:13
  • 163

Java中死锁的检测

死锁这个概念我相信大家都不陌生,现在的问题是在发生了死锁的时候我们怎么去检测死锁呢? 下面给出两种常用的方式来检测死锁。 我先给出一段运行在本地的死锁代码: ? 1 2 3 4 5 6 7 8 9 ...
  • Double_Name
  • Double_Name
  • 2016-04-19 17:24
  • 445

Java线程死锁查看分析方法

如何查看是否有Java线程死锁?下面介绍两种方法。JconsoleJconsole是JDK自带的图形化界面工具。 使用JDK给我们的的工具JConsole,可以通过打开cmd然后输入jconsole打开。 连接到需要查看的进程。打开线程选项卡,然后点击左下角的“检测死锁” jconsole就会给我们...
  • abc86319253
  • abc86319253
  • 2015-10-31 16:40
  • 4511

Java虚拟机工具之堆栈跟踪工具jstack检测死锁

jstack是一个很实用的工具,不仅能定位到死循环的位置,还能找到死锁的位置,这个工具对我们直接在生产机上定位错误带来了极大的方便,尤其是那些不容易复现的错误。首先呢,先写一个能产生死锁的代码。代码逻辑很简单,咱就产生两个线程,两个线程分别执行加锁与放锁两个动作,啥时候产生死锁呢,就是在两个线程都释...
  • sinat_36246371
  • sinat_36246371
  • 2016-11-07 15:21
  • 1752

java多线程系列:死锁及检测

本文属于并发编程网多线程学习梳理系列。原文如下: 死锁 死锁是两个或更多线程阻塞着等待其它处于死锁状态的线程所持有的锁。死锁通常发生在多个线程同时但以不同的顺序请求同一组锁的时候。 例如,如果线程1锁住了A,然后尝试对B进行加锁,同时线程2已经锁住了B,接着尝试对A进行加锁,这时死...
  • bohu83
  • bohu83
  • 2016-04-12 17:00
  • 1508

java查看线程死锁

那我们怎么确定一定是死锁呢?有两种方法。   1>使用JDK给我们的的工具JConsole,可以通过打开cmd然后输入jconsole打开。     1)连接到需要查看的进程。 2)打开线程选项卡,然后点击左下角的“检测死锁”     3)jconsole就会给我们检测出该线程...
  • huaweitman
  • huaweitman
  • 2016-12-21 10:51
  • 348

Java中的锁

在学习或者使用Java的过程中进程会遇到各种各样的锁的概念:公平锁、非公平锁、自旋锁、可重入锁、偏向锁、轻量级锁、重量级锁、读写锁、互斥锁等待。这里整理了Java中的各种锁,若有不足之处希望大家在下方留言探讨。公平锁和非公平锁公平锁是指多个线程在等待同一个锁时,必须按照申请锁的先后顺序来一次获得锁。...
  • u013256816
  • u013256816
  • 2016-04-20 21:38
  • 8532
    个人资料
    • 访问:237157次
    • 积分:2728
    • 等级:
    • 排名:第15667名
    • 原创:75篇
    • 转载:25篇
    • 译文:0篇
    • 评论:33条
    博客专栏
    最新评论