Java教程

jstack跟踪Java堆栈信息

本文主要是介绍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
这篇关于jstack跟踪Java堆栈信息的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!