参考博客:https://www.jianshu.com/p/213710fb9e40
jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈 的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,
如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。
线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事情,或者等待着什么资源
首先jps -l 查看java进程:
接着再用jstack 21028 查看线程状态
发现诊断到了死锁:
死锁演示代码如下
public class DeadLockTest { /** *线程死锁等待演示 */ static class SynAddRunalbe implements Runnable{ int a,b; public SynAddRunalbe(int a,int b){ this.a=a; this.b=b; } @Override public void run(){ synchronized(Integer.valueOf(a)){ synchronized(Integer.valueOf(b)){ System.out.println(a+b); } } } } public static void main(String[]args){ for(int i=0;i<100;i++){ new Thread(new SynAddRunalbe(1,2)).start(); new Thread(new SynAddRunalbe(2,1)).start(); } } }