打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
使用jstack检测Java应用的死锁(deadlock)状态

We can get the concept of deadlock in wikipedia.

The picture below gives a common scenario which leads to deadlock.

In this blog, I will share how to detect deadlock situation using JDK standard tool jstack. First we have to write a Java program which will lead to Deadlock:

package thread;public class DeadLockExample {/*  * Thread 1: locked resource 1    Thread 2: locked resource 2  */public static void main(String[] args) {  final String resource1 = "ABAP";  final String resource2 = "Java";  // t1 tries to lock resource1 then resource2  Thread t1 = new Thread() {   public void run() {    synchronized (resource1) {     System.out.println("Thread 1: locked resource 1");     try {      Thread.sleep(100);     } catch (Exception e) {     }     synchronized (resource2) {      System.out.println("Thread 1: locked resource 2");     }    }   }  };  Thread t2 = new Thread() {   public void run() {    synchronized (resource2) {     System.out.println("Thread 2: locked resource 2");     try {      Thread.sleep(100);     } catch (Exception e) {     }     synchronized (resource1) {      System.out.println("Thread 2: locked resource 1");     }    }   }  };  t1.start();  t2.start();}}

Execute this program, you will get output: Thread 1: locked resource 1 Thread 2: locked resource 2 Then use command jps -l -m to list the process id of this deadlock program. In my example it is 51476:

Just type jstack + process id, and it will display all detailed information about deadlock:

Here the object 0x00000000d6f64988 and 0x00000000d6f649b8represent the two resource String “ABAP” and “Java”.

Update on 2017-03-04 Saturday 10:35PM

how to get the thread state of a long-running application

Suppose you have found a long-running application which has high CPU utilization rate and you would like to know which exactly line is relevant. Use the following code to simulate the long running situation:

package thread;import java.util.ArrayList;import java.util.List;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;class MyThread implements Runnable{    private List<Integer> myList;    private Object host;    public MyThread(List<Integer> list, Object object){        this.myList = list;        this.host = object;    }    public void updateListSafe(){        synchronized(this.host){            ArrayList<Integer> safe = new ArrayList<Integer>();            safe.add(1);        }    }    private void updateList(int i){        synchronized(this.host){            myList.add(i);        }    }    @Override    public void run() {        while(true){            updateList(1);        }    }}public class MyExecutor {    private ArrayList<Integer> taskList = new ArrayList<Integer>();    private Object object = new Object();    private void launch(){        ExecutorService executorService= Executors.newFixedThreadPool(10);        executorService.execute(new MyThread(taskList, object));        executorService.execute(new MyThread(taskList, object));    }    public static void main(String[] args) {        MyExecutor test = new MyExecutor();        test.launch();    }}

first find the process id of running application:

then use command jstack 23520 to get the stack trace:

In line 9 and line 18 our application method MyThread.updateList is listed there.

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
一个简单的Java死锁示例
如何分析Java虚拟机死锁
JVM调优-jstack用法
用“逐步排除”的方法定位Java服务线上“系统性”故障
ASP.NET(C#) 定时执行一段代码
深入研究C#同步与互斥的lock方法与Monitor类的关系 - 学IT网 xueit.c...
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服