用途说明
jstack
是 JDK 自带的一个工具,用于生成 Java 进程的线程快照(也称为堆栈跟踪)。它可以用于诊断 Java 应用程序中的线程问题,比如死锁、线程阻塞等。下面是 jstack
的基本使用方法:
命令参数
Usage:
jstack [-l] <pid>
(to connect to running process)
jstack -F [-m] [-l] <pid>
(to connect to a hung process)
jstack [-m] [-l] <executable> <core>
(to connect to a core file)
jstack [-m] [-l] [server_id@]<remote server IP or hostname>
(to connect to a remote debug server)
Options:
-F to force a thread dump. Use when jstack <pid> does not respond (process is hung)
-m to print both java and native frames (mixed mode)
-l long listing. Prints additional information about locks
-h or -help to print this help message
通常用法
jstack <pid> > thread_dump.txt
-F 参数代表强制执行
-m 生成带有本地变量和锁信息的线程快照。使用 -m
参数可能会增加线程快照的大小,并稍微增加生成线程快照的时间,但通常这种额外的信息对于定位问题非常有帮助。
线程状态
在 jstack
输出的线程快照中,线程状态通常以如下几种形式展示:
-
RUNNABLE(运行状态):表示线程正在 JVM 中执行 Java 代码,或者是等待操作系统调度执行。
-
BLOCKED(阻塞状态):表示线程被阻塞,通常是由于它试图获取一个对象的监视器锁(synchronized 代码块或方法)而被其他线程持有该锁,也可能是由于调用了
Object.wait()
方法而进入了等待状态。 -
WAITING(等待状态):表示线程正在等待某个条件的发生,如等待另一个线程的通知,或者等待某个条件的满足而进入休眠状态。常见于调用
Object.wait()
、Thread.join()
、LockSupport.park()
等方法时。 -
TIMED_WAITING(计时等待状态):类似于 WAITING 状态,但是在等待期间指定了超时时间。常见于调用带有超时参数的
Object.wait()
、Thread.sleep()
、Thread.join()
等方法时。 -
TERMINATED(终止状态):表示线程已经执行完成,不再执行任何代码。
通常,我们需要重点关注BLOCKED(阻塞状态),WAITING(等待状态)的线程,再结合具体的代码以及业务场景来分析问题。
后面笔者准备出一期实战案例来详细分析排查jvm出现的问题,敬请期待