• java中在linux下利用jstack检测死锁


    首先,编写一个死锁程序

     1 package deadlock;
     2 
     3 public class testJstack {
     4     final static Object resource_1 = new Object();
     5     final static Object resource_2 = new Object();
     6 
     7     public static void main(String[] args) {
     8         Thread t1 = new Thread("t1") {
     9             public void run() {
    10                 synchronized (resource_1) {
    11                     try {
    12                         Thread.sleep(3000);
    13                     } catch (InterruptedException e) {
    14                     }
    15                     System.out.println("locked resource_1");
    16                     synchronized (resource_2) {
    17                         System.out.println("thread t1 done.");
    18                     }
    19                 }
    20             }
    21         };
    22 
    23         Thread t2 = new Thread("t2") {
    24             public void run() {
    25                 synchronized (resource_2) {
    26                     System.out.println("locked resource_2");
    27                     synchronized (resource_1) {
    28                         System.out.println("thread t2 done.");
    29                     }
    30                 }
    31             }
    32         };
    33         t1.start();
    34         t2.start();
    35     }
    36 }

    程序运行结果是:

    lock resource_2
    lock resource_1

    接下来在终端中输入jsp查看当前运行的java程序:

    7480 testJstack
    13420 Jps

    获取testJstack的进程ID为7480.然后使用命令:

    jstack -l 7480 >deadlock.jstack

    将jstack检测结果放入文件deadlock.jstack。使用vim查看该文件:

    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.
  • 相关阅读:
    一种想法
    识别link_text
    识别name
    识别id
    文件的读写
    条件和循环
    网站测试-功能测试小结
    拷贝
    #团队博客作业1-小组成员介绍
    软件测试基础-Homework1
  • 原文地址:https://www.cnblogs.com/lixiaolun/p/5273293.html
Copyright © 2020-2023  润新知