文档章节

利用jstack检测死锁DeadLock

明舞
 明舞
发布于 2016/07/08 10:49
字数 374
阅读 246
收藏 1

首先,制造一个死锁程序如下:

public class testJstack {
 final static Object obj_1 = new Object();
 final static Object obj_2 = new Object();
  public static void main(String[] args){
   
   Thread t1 = new Thread("t1"){
    public void run(){
     synchronized(obj_1){
      try{
       Thread.sleep(3000);
      }catch(InterruptedException e){}
      System.out.println("lock obj_1");
      synchronized(obj_2){
       System.out.println("thread t1 done.");
      }
     }
     
     
    }
   };
   
   Thread t2 = new Thread("t2"){
    public void run(){
     synchronized(obj_2){
      
      System.out.println("lock obj_2");
      synchronized(obj_1){
       System.out.println("thread t2 done.");
      }
      
     }
     
    }
   };
   t1.start();
   t2.start();
  }

 

 

在eclipse中执行之后,程序就会进入漫无休止的等待。这时,我们可以在linux命令行下,查看死锁的状态。

 

首先, 利用jps查看当前执行的java进程。如下:

 

jps

8759 

9734 testJstack

9751 Jps

 

利用jstack命令如下:

 

jstack -l 9734 > deadlock.jstack

 

利用vim 打开deadlock.jstack文件,发现内容如下:

2011-04-28 21:42:40
   java.lang.Thread.State: RUNNABLE
   Locked ownable synchronizers:
        - None
   java.lang.Thread.State: RUNNABLE
   java.lang.Thread.State: BLOCKED (on object monitor)
        at testJstack$2.run(testJstack.java:29)
        - waiting to lock <0x8c087670> (a java.lang.Object)
        - locked <0x8c087678> (a java.lang.Object)
   java.lang.Thread.State: BLOCKED (on object monitor)
        at testJstack$1.run(testJstack.java:15)
   Locked ownable synchronizers:
        - None
   java.lang.Thread.State: RUNNABLE
   Locked ownable synchronizers:
        - None
   java.lang.Thread.State: RUNNABLE
   Locked ownable synchronizers:
   java.lang.Thread.State: RUNNABLE
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - locked <0x8c050b30> (a java.lang.ref.ReferenceQueue$Lock)
   Locked ownable synchronizers:
        - None
        - waiting on <0x8c050a30> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:485)
        - locked <0x8c050a30> (a java.lang.ref.Reference$Lock)
   Locked ownable synchronizers:
"VM Thread" prio=10 tid=0x0807e800 nid=0x260c runnable
JNI global references: 576
Found one Java-level deadlock:
=============================
"t2":
  which is held by "t1"
"t1":
  which is held by "t2"
Java stack information for the threads listed above:
===================================================
"t2":
        at testJstack$2.run(testJstack.java:29)
        - waiting to lock <0x8c087670> (a java.lang.Object)
        - locked <0x8c087678> (a java.lang.Object)
"t1":
        at testJstack$1.run(testJstack.java:15)
        - waiting to lock <0x8c087678> (a java.lang.Object)
        - locked <0x8c087670> (a java.lang.Object)
Found 1 deadlock.

如上,我们看到jstack确实检测到了一个死锁。

 

© 著作权归作者所有

明舞
粉丝 231
博文 424
码字总数 516555
作品 0
程序员
私信 提问
利用jstack检测死锁DeadLock

首先,制造一个死锁程序如下: public class testJstack { final static Object obj_1 = new Object(); final static Object obj_2 = new Object(); public static void main(String[] args)......

明舞
2016/03/17
726
0
从FindBugs中学Java【五】

TLWTWOLOCKWAIT TLW: Wait with two locks held (TLWTWOLOCKWAIT) Waiting on a monitor while two locks are held may cause deadlock. Performing a wait only releases the lock on the o......

小紅
2015/04/12
89
0
如何写一个jstack检测不到的死锁

通常java程序排查死锁的办法是通过jstack 打印出线程信息,里面会直接显示发生死锁的情况。这里我们先解释下查死锁可以采用的两种办法。然后我们写一个用普通的方法检测不到的死锁。 这里我们...

robin-yao
2016/12/17
2.2K
7
JVM命令之jstack深入讲解

在JVM命令使用演示这篇文章里演示了一些jvm命令的使用,这篇文章重点对jstack做一些深入的讲解。 作用 jstack主要用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线...

_Jimin_
2018/07/16
0
0
PostgreSQL 如何检测分布式死锁 - postgrespro pg_shardman

标签 PostgreSQL , postgrespro , pg_shardman , 分布式死锁 背景 单机的死锁检测是比较容易实现的,通过判断等待中的事务是否查询环状,即可实现。例如下面的图,A等B, B等C, C等A,出现环状...

德哥
2018/10/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

拯救 项目经理个人时间的5个技巧

优秀的项目经理都有一个共同点,那就是良好的时间管理能力。专业的项目经理会确保他们的时间投入富有成效,尽可能避免时间浪费。 时间管理叫做GTD,即Getting Things Done——“把事情做完”...

Airship
15分钟前
2
0
前端技术之:Prisma Demo服务部署过程记录

安装前提条件: 1、已经安装了docker运行环境 2、以下命令执行记录发生在MackBook环境 3、已经安装了PostgreSQL(我使用的是11版本) 4、Node开发运行环境可以正常工作 首先需要通过Node包管...

popgis
今天
5
0
数组和链表

数组 链表 技巧一:掌握链表,想轻松写出正确的链表代码,需要理解指针获引用的含义: 对指针的理解,记住下面的这句话就可以了: 将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指...

code-ortaerc
今天
4
0
栈-链式(c/c++实现)

上次说“栈是在线性表演变而来的,线性表很自由,想往哪里插数据就往哪里插数据,想删哪数据就删哪数据...。但给线性表一些限制呢,就没那么自由了,把线性表的三边封起来就变成了栈,栈只能...

白客C
今天
43
0
Mybatis Plus service

/** * @author beth * @data 2019-10-20 23:34 */@RunWith(SpringRunner.class)@SpringBootTestpublic class ServiceTest { @Autowired private IUserInfoService iUserInfoS......

一个yuanbeth
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部