jstack介绍

jstack是java虚拟机自带的一种堆栈跟踪工具,用于生成java虚拟机当前时刻的线程快照。

生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。

使用jstack的一般步骤

查找java进程id


这里得到的进程ID是10226.

找出最耗费CPU的线程

可以使用:

1
2
3
1.ps -Lfp pid
2.ps -mp pid -o THREAD, tid, time
3.top -Hp pid

上面3者之一。这里使用第3种:

1
top -Hp 10226

TIME列就是各个Java线程耗费的CPU时间,CPU时间最长的是线程ID为11149的线程,用printf "%x\n" 11149得到11149的十六进制值为2b8d,下面会用到。

使用jstack输出进程10226的堆栈信息,然后根据线程ID的十六进制grep。

1
jstack 10226 | grep 2b8d

接下来就可以根据结果分析代码了。

或者直接在找出进程id后,使用jstack -l 10226 > 10226.txt将进程的所有堆栈想信息输出到10226.txt文件。
然后分析10226.txt,找出有问题的代码修改。
比如:

可以看到有问题的代码和行数。

参考:线程的状态信息Java命令学习系列(二)——Jstack执行jstack报Unable to open socket file错误