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

简介: 使用jstack检测Java应用的死锁(deadlock)状态

We can get the concept of deadlock in wikipedia.

The picture below gives a common scenario which leads to deadlock.image.pngIn 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:image.pngimage.pngUpdate 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();
  }
}

image.png



相关文章
|
3月前
|
存储 资源调度 Java
详解Java线程的几种状态
详解Java线程的几种状态
25 0
|
Java 开发者
使用jstack结合代码来演示【Java线程状态】
Java线程状态一直是让工程师容易迷惑的知识点,我觉得原因有二:一是线程的概念较为抽象,其状态转换的条件和时间点不容易理解;二是线程状态和进程状态不是完全对应的,且线程的状态词汇容易让人误解。下面我们通过jstack结合代码来探究一下Java线程状态相关的关键知识点。
248 0
|
7月前
|
Java
Java线程状态
Java线程状态
32 0
|
8月前
|
Java
Java线程的几种状态
Java线程的几种状态
34 0
使用 jconsole 命令观察线程
当我们使用多线程编程时,我们可以使用 jconsole 来观察线程的状况。下面我将带领大家如何找到 jconsole 命令
使用 jconsole 命令观察线程
|
Java 调度
关于JAVA线程五种状态的理解
关于JAVA线程五种状态的理解
158 0
关于JAVA线程五种状态的理解
|
存储 Java C++
Java线程状态详解
Java的每个线程都具有自己的状态,Thread类中成员变量threadStatus存储了线程的状态
112 0
|
Java 调度
Java线程的状态
Java线程的状态
193 0
Java线程的状态
|
Arthas 监控 网络协议
一次由于OOM导致锁没有释放的定位流程(结合Arthas)
一次由于OOM导致锁没有释放的定位流程(结合Arthas)
|
人工智能 Java 大数据
jstack命令:教你如何排查多线程问题
image 这是之前的一个死锁案例: 一个多线程死锁案例,如何避免及解决死锁问题? 如程序中发生这样的死锁问题该如何排查呢?我们可以使用java自带的jstack命令进行排查。
3107 0