深入理解Java虚拟机——Java堆栈跟踪工具(jstack)
Posted 小志的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入理解Java虚拟机——Java堆栈跟踪工具(jstack)相关的知识,希望对你有一定的参考价值。
目录
一、Java堆栈跟踪工具(jstack)的概述
- jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或javacore文件)。
二、线程快照
2.1、线程快照的概述
- 线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合。
2.2、线程快照的目的
- 生产线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待都是导致线程长时间停顿的原因。
- 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事,或者等待着什么资源。
三、Java堆栈跟踪工具(jstack)的格式及参数说明
-
jstack格式
jstack [option] vmid -
参数说明
选项 作用 -F 当正常输出的请求不被响应时,强制输出线程堆栈 l 除堆栈外,显示关于锁的附加信息 m 如果调用到本地方法的话,可以显示C/C++的堆栈
四、Java堆栈跟踪工具(jstack)的执行样例1
-
执行查看进程号命令
jps
-
查看线程的信息
jstack -l pid
-
截图如下:
四、Java堆栈跟踪工具(jstack)的执行样例2
-
在JDK1.5中,java.lang.Thread类新增了一个getAllStackTraces()方法用于获取虚拟机中所有线程的StackTraceElement对象。使用这个方法可以通过简单的几行代码就完成jstack的大部分功能。
-示例代码import java.util.Map; /** * @description: * @author: xz */ public class Test1 public static void main(String[] args) Map<Thread, StackTraceElement[]> allStackTraces = Thread.getAllStackTraces(); for(Map.Entry<Thread,StackTraceElement[]> en :allStackTraces.entrySet()) Thread key =en.getKey(); StackTraceElement[] value = en.getValue(); System.out.println("Thread name is "+ key.getName()); for(StackTraceElement str: value) System.out.println("\\t"+ str.toString());
-
输出结果如下:
以上是关于深入理解Java虚拟机——Java堆栈跟踪工具(jstack)的主要内容,如果未能解决你的问题,请参考以下文章
深入理解java虚拟机基础故障处理工具(jmapjhatjstack等)