目 录CONTENT

文章目录

使用jstack排查多线程死锁、阻塞

BKUN
2024-01-11 / 0 评论 / 0 点赞 / 464 阅读 / 696 字

问题背景:

针对线上多线程死锁、阻塞,跑着跑着就卡住了
查看线上线程池的状态

jstack用于生成java虚拟机当前时刻的线程快照。

线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。

jstack:java堆栈跟踪工具

jstack用于生成java虚拟机当前时刻的线程快照。

线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。

命令格式:
jstack [ option ] pid
jstack [ option ] executable core
jstack [ option ] [server-id@]remote-hostname-or-IP

执行jstack命令,将得到进程的堆栈信息。我一般使用jstack -l pid来得到长列表,显示其详细信息。

有时线程挂起的时候,需要执行jstack -F pid来获取。

在实际运行中,往往一次 dump的信息,还不足以确认问题。建议产生三次 dump信息,如果每次 dump都指向同一个问题,我们才确定问题的典型性。
堆栈信息只是一种参考,一些正常RUNNING的线程,由于复杂网络环境和IO的影响,也是有问题的,用jstack就无法定位,需要结合对业务代码的理解。

使用:查看服务进程的线程情况

jstack -l 13109
jstack 13109 > thread_dump.txt

Java语言定义了6种线程池状态:

New:创建后尚未启动的线程处于这种状态,不会出现在Dump中。
RUNNABLE:包括Running和Ready。线程开启start()方法,会进入该状态,在虚拟机内执行的。
Waiting:无限的等待另一个线程的特定操作。
Timed Waiting:有时限的等待另一个线程的特定操作。
阻塞(Blocked):在程序等待进入同步区域的时候,线程将进入这种状态,在等待监视器锁。
结束(Terminated):已终止线程的线程状态,线程已经结束执行。

Dump文件的线程状态一般其实就以下3种:

RUNNABLE,线程处于执行中
BLOCKED,线程被阻塞
WAITING,线程正在等待

0

评论区