jstack跟踪Java堆栈信息
作者:互联网
1、简介
jstack(Java Virtual Machine Stack Trace)是JDK提供的一个可以生成Java虚拟机当前时刻的线程快照信息的命令行工具。线程快照一般被称为threaddump或者javacore文件,是当前Java虚拟机中每个线程正在执行的Java线程、虚拟机内部线程和可选的本地方法堆栈帧的集合。对于每个方法栈帧,将会显示完整的类名、方法名、字节码索引(bytecode index,BCI)和行号。生成的线程快照可以用于定位线程出现长时间停顿的原因,比如:线程间死锁、死循环、请求外部资源被长时间挂起等等。
2、jstack命令参数
命令语法:
jstack [options] pid
命令参数说明:
option
:jstack命令的可选参数。如果没有指定这个参数,jstack命令会显示Java虚拟机当前时刻的线程快照信息,如下图
-F参数
如果Java虚拟机进程由于进程挂起而没有任何响应,那么可以使用-F
参数(仅在Oracle Solaris和Linux操作系统上游戏)强制显示线程快照信息。
-l参数
如果使用-l
参数,除了方法栈帧以外,jstack命令还会显示关于锁的附加信息,比如属于java.util.concurrent的ownable synchronizers列表。
-m参数
如果使用-m
参数,jstack命令将显示混合的栈帧信息,除了Java方法栈帧以外,还有本地方法栈帧。本地方法栈帧是C或C++编写的虚拟机代码或JNI/native代码。
3、jstack 分析 CPU 问题
top -Hp pid来找到 CPU 使用率比较高的一些线程
将排在前面的线程 PID 转换成十六进制
printf ‘%x\n’ pid得到 nid
打印 Java 线程栈的信息
jstack pid |grep ‘nid’ -C5 –color
jstack 24076| grep 5e0d -A30
- 2838:java 进程
- 12c8:线程十六进制
- -A30:打印 30 行
- 包含:包名、类名、代码行信息,可以快速定位到某行代码导致该线程 CPU 使用率过高
- jstack:JDK 自带命令
当然更常见的是我们对整个 jstack 文件进行分析,通常我们会比较关注 WAITING 和 TIMED_WAITING 的部分,BLOCKED 就不用说了。我们可以使用命令
cat jstack.log | grep "java.lang.Thread.State" | sort -nr | uniq -c
标签:Java,虚拟机,jstack,快照,线程,堆栈,参数 来源: https://www.cnblogs.com/uestc2007/p/16310310.html