版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qincidong/article/details/82781485
jstack介绍
jstack是java虚拟机自带的一种堆栈跟踪工具,用于生成java虚拟机当前时刻的线程快照。
生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。
使用jstack的一般步骤
查找java进程id
这里得到的进程ID是10226.
找出最耗费CPU的线程
可以使用:
1.ps -Lfp pid
2.ps -mp pid -o THREAD, tid, time
3.top -Hp pid
上面3者之一。这里使用第3种:
top -Hp 10226
TIME列就是各个Java线程耗费的CPU时间,CPU时间最长的是线程ID为11149的线程,用printf "%x\n" 11149
得到11149的十六进制值为2b8d,下面会用到。
使用jstack输出进程10226的堆栈信息,然后根据线程ID的十六进制grep。
jstack 10226 | grep 2b8d
接下来就可以根据结果分析代码了。
或者直接在找出进程id后,使用jstack -l 10226 > 10226.txt
将进程的所有堆栈想信息输出到10226.txt文件。
然后分析10226.txt,找出有问题的代码修改。
比如:
可以看到有问题的代码和行数。
参考:线程的状态信息、Java命令学习系列(二)——Jstack、执行jstack报Unable to open socket file错误