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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

使用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 stati c void main(String[] args) { final String resource1 = "ABAP"; fin al String resource2 = "Java"; // t1 tries to lock resource1 then re source2 Thread t1 = new Thread() { public void run() { synch ronized (resource1) { System.out.println("Thread 1: locked res ource 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.pri ntln("Thread 2: locked resource 2"); try { Thread.sleep(100); } catch (Exception e) { } synchronized (resource1) { Sy
stem.out.println("Thread 2: locked resource 1"); } } } }; t1.s tart(); 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.conc urrent.Executors;class MyThread implements Runnable{ privat e List<Integer> myList; private Object host; public MyThrea d(List<Integer> list, Object object){ this.myList = list; th is.host = object; } public void updateListSafe(){ synchron ized(this.host){ ArrayList<Integer> safe = new ArrayList<I nteger>(); safe.add(1); } } private void updateList(i nt i){ synchronized(this.host){ myList.add(i); } } @Override public void run() { while(true){ updateL ist(1); } }}public class MyExecutor { private ArrayList<Inte ger> taskList = new ArrayList<Integer>(); private Object objec t = new Object(); private void launch(){ ExecutorService ex ecutorService= Executors.newFixedThreadPool(10); executo rService.execute(new MyThread(taskList, object)); executorS ervice.execute(new MyThread(taskList, object)); } public stati c void main(String[] args) { MyExecutor test = new MyExecu tor(); unch(); }}
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.。

相关文档
最新文档