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的主要内容,如果未能解决你的问题,请参考以下文章

给你的Java程序拍个片子吧:jstack命令解析

java jstack命令详解

java命令-(学习)jstack 工具

java命令--jstack 工具

Jstack 命令分析

Java命令:Jstack