jstack可以导出线程信息
在启动java项目时,会打印对应的端口信息,通过端口我们可以查询到对应的进程id
linux下:
netstat -tunlp | grep [port]
windows下:
netstat -ano | findstr [port]
也可以使用jdk提供的工具jps查询进程信息:
jps
然后使用jstack就可以导出对应的线程信息:
jstack [进程id] > [导出文件存储的位置]
测试代码如下:
package com.wk.concurrency.demo;
public class DeadLockDemo {
public static String a = "A";
public static String b = "B";
public static void main(String[] args) {
new DeadLockDemo().deadLock();
}
private void deadLock() {
Thread t1 = new Thread(() -> {
synchronized (a) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (b) {
System.out.println("1");
}
}
});
Thread t2 = new Thread(() -> {
synchronized (b) {
synchronized (a) {
System.out.println("2");
}
}
});
t1.start();
t2.start();
}
}
通过jstack导出dump文件后,可以发现以下内容:
Java stack information for the threads listed above:
===================================================
"Thread-1":
at com.wk.concurrency.demo.DeadLockDemo.lambda$deadLock$1(DeadLockDemo.java:27)
- waiting to lock <0x00000007412cd8d0> (a java.lang.String)
- locked <0x00000007412cd900> (a java.lang.String)
at com.wk.concurrency.demo.DeadLockDemo$$Lambda$2/804581391.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
"Thread-0":
at com.wk.concurrency.demo.DeadLockDemo.lambda$deadLock$0(DeadLockDemo.java:20)
- waiting to lock <0x00000007412cd900> (a java.lang.String)
- locked <0x00000007412cd8d0> (a java.lang.String)
at com.wk.concurrency.demo.DeadLockDemo$$Lambda$1/6738746.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
Found 1 deadlock.
可以看到死锁,以及死锁产生的位置。