目錄:Java線程死鎖檢測
死鎖例子:
public class DeadLockTest implements Runnable {
public String userName;
public Object lockOne = new Object();
public Object lockTwo = new Object();
public void setFlag(String userName) {
this.userName = userName;
}
@Override
public void run() {
if ("a".equals(userName)) {
synchronized (lockOne) {
try {
System.out.println("userName -> " + userName);
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockTwo) {
System.out.println("lockOne - > lockTwo");
}
}
}
if ("b".equals(userName)) {
synchronized (lockTwo) {
try {
System.out.println("userName -> " + userName);
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockOne) {
System.out.println("lockTow -> lockOne");
}
}
}
}
public static void main(String[] args) throws InterruptedException {
DeadLockTest d1 = new DeadLockTest();
d1.setFlag("a");
new Thread(d1).start();
Thread.sleep(1000);
d1.setFlag("b");
new Thread(d1).start();
}
}
1、使用jconsole
1.1 是什麼?
jconsole是jdk自帶的內置java性能分析器,用來監控Java應用程序的性能和跟蹤Java中的代碼.
1.2 怎麼用?(win環境爲例)
(1)cmd下輸入 jconsole,回車。
C:\Users\10498>jconsole
顯示出下圖的JUI界面,這裏可以看出,jconsole支持本地,也支持遠程連接。
(2)選擇本地進程,點擊需要查看的進程,連接。
(3)查看線程死鎖,選擇”線程“,再點擊“檢測死鎖”,選擇線程,查看信息,可以看到死鎖信息,類名及方法名。
2、使用jstack
2.1 是什麼?
jstack是java虛擬機自帶的一種堆棧跟蹤工具。
2.2 怎麼用?
(1)先用jps查看進程pid信息。
C:\Users\10498>jps
13136 Launcher
13264 Jps
8736 RemoteMavenServer
9092 DeadLockTest
13464 JConsole
9372
(2)使用jstack -l [pid]查看其中的線程信息,可看到Found one Java-level deadlock:及具體的死鎖信息展示。
C:\Users\10498>jstack -l 9092
2019-08-11 15:13:01
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.181-b13 mixed mode):
//省略
Found one Java-level deadlock:
=============================
"Thread-1":
waiting to lock monitor 0x000000001d1535c8 (object 0x000000076b877570, a java.lang.Object),
which is held by "Thread-0"
"Thread-0":
waiting to lock monitor 0x000000001d150d38 (object 0x000000076b877580, a java.lang.Object),
which is held by "Thread-1"
Java stack information for the threads listed above:
===================================================
"Thread-1":
at com.wyq.hello2.DeadLockTest.run(DeadLockTest.java:40)
- waiting to lock <0x000000076b877570> (a java.lang.Object)
- locked <0x000000076b877580> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:748)
"Thread-0":
at com.wyq.hello2.DeadLockTest.run(DeadLockTest.java:25)
- waiting to lock <0x000000076b877580> (a java.lang.Object)
- locked <0x000000076b877570> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:748)
Found 1 deadlock.
3、使用jvisualvm
3.1 是什麼?
JVM 監控工具,可以監控 CPU ,內存,類,線程等運行狀況,實時監控服務器性能。
3.2 怎麼用?
(1)cmd下輸入 jvisualvm,顯示GUI界面,選擇相應進程查看
C:\Users\10498>jvisualvm
C:\Users\10498>
The launcher has determined that the parent process has a console and will reuse it for its own console output.
Closing the console will result in termination of the running program.
Use '--console suppress' to suppress console output.
Use '--console new' to create a separate console window.
(2)點擊“線程”,再點擊“dump”可以查看詳細信息