java命令-jstack

时间:2023-03-09 07:49:39
java命令-jstack

jstack用于生产java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法

堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,比如线程间死锁、死循环、请求

外部资源导致长时间等待等。线程出现停顿的时候通过jstack命令可查看各个线程的调用堆栈

线程状态

new 未启动

runnable 在虚拟机内执行

blocked 阻塞并等待监视器锁

waiting 无限等待另一个线程执行特定操作

timed_waiting 有时限地等待另一个线程的特定操作

terminated 已退出

jstack使用简单示例(死锁情况模拟)

 public class DeadLock {

     public static void main(String[] args) {
//获取当前线程pid
System.out.println(ManagementFactory.getRuntimeMXBean().getName());
Thread t1 = new Thread(new DeadLockClass(true));
Thread t2 = new Thread(new DeadLockClass(false));
t1.start();
t2.start();
}
} class DeadLockClass implements Runnable {
public boolean flag; public DeadLockClass(boolean flag) {
this.flag = flag;
} @Override
public void run() {
if(flag) {
while(true) {
synchronized (SuoObject.obj_1) {
System.out.println("obj_1" + Thread.currentThread().getName());
synchronized (SuoObject.obj_2) {
System.out.println("obj_2" + Thread.currentThread().getName());
}
}
}
}else {
while(true) {
synchronized (SuoObject.obj_2) {
System.out.println("obj_2" + Thread.currentThread().getName());
synchronized (SuoObject.obj_1) {
System.out.println("obj_1" + Thread.currentThread().getName());
}
}
}
}
}
} class SuoObject {
static Object obj_1 = new Object();
static Object obj_2 = new Object();
}

根据打印出的线程pid, 使用jstack pid命令,即可出现如下如所示结果,死锁的信息一目了然!!!

java命令-jstack