java命令-jstack
Posted kankankankankan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java命令-jstack相关的知识,希望对你有一定的参考价值。
jstack用于生产java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法
堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,比如线程间死锁、死循环、请求
外部资源导致长时间等待等。线程出现停顿的时候通过jstack命令可查看各个线程的调用堆栈
线程状态
new 未启动
runnable 在虚拟机内执行
blocked 阻塞并等待监视器锁
waiting 无限等待另一个线程执行特定操作
timed_waiting 有时限地等待另一个线程的特定操作
terminated 已退出
jstack使用简单示例(死锁情况模拟)
1 public class DeadLock { 2 3 public static void main(String[] args) { 4 //获取当前线程pid 5 System.out.println(ManagementFactory.getRuntimeMXBean().getName()); 6 Thread t1 = new Thread(new DeadLockClass(true)); 7 Thread t2 = new Thread(new DeadLockClass(false)); 8 t1.start(); 9 t2.start(); 10 } 11 } 12 13 14 class DeadLockClass implements Runnable { 15 public boolean flag; 16 17 public DeadLockClass(boolean flag) { 18 this.flag = flag; 19 } 20 21 @Override 22 public void run() { 23 if(flag) { 24 while(true) { 25 synchronized (SuoObject.obj_1) { 26 System.out.println("obj_1" + Thread.currentThread().getName()); 27 synchronized (SuoObject.obj_2) { 28 System.out.println("obj_2" + Thread.currentThread().getName()); 29 } 30 } 31 } 32 }else { 33 while(true) { 34 synchronized (SuoObject.obj_2) { 35 System.out.println("obj_2" + Thread.currentThread().getName()); 36 synchronized (SuoObject.obj_1) { 37 System.out.println("obj_1" + Thread.currentThread().getName()); 38 } 39 } 40 } 41 } 42 } 43 } 44 45 class SuoObject { 46 static Object obj_1 = new Object(); 47 static Object obj_2 = new Object(); 48 }
根据打印出的线程pid, 使用jstack pid命令,即可出现如下如所示结果,死锁的信息一目了然!!!
以上是关于java命令-jstack的主要内容,如果未能解决你的问题,请参考以下文章