Java jstack 怎么用
你有没有遇到过这样的情况:运行了很久的Java程序突然变慢,甚至卡住不动,可又找不到具体原因?这时候,一个叫jstack的工具就能帮你“透视”程序内部的运行状态,把藏着的“堵点”揪出来。
很多开发者一听“工具”“Java”就觉得晦涩,但其实jstack的用法特别接地气,就像给程序拍一张“实时心电图”——每个线程的状态、在做什么、有没有卡住,都能清清楚楚显示出来。接下来咱们一步步把它的用法说透,看完就能上手。

第一步:先找到要“检查”的Java程序
jstack是命令行工具,得先知道你要分析的Java程序的进程ID(PID),就像你要查某台机器的状态,得先找到它的编号。
怎么找PID?不同系统方法不一样:Windows打开任务管理器,找“Java”相关进程,列出来的PID就是;Mac或Linux打开终端,输入jps命令(这是Java自带的小工具),就能看到所有运行中的Java程序,后面跟着的数字就是PID。比如运行jps后显示“1234 MyApp”,那这个1234就是我们要找的PID。
第二步:用jstack拍“线程快照”
找到PID后,直接在命令行输入jstack [PID],比如jstack 1234,回车后就会弹出一大段文字。别担心看不懂,这些文字就是程序里所有线程的“实时状态记录”。
举个生活化的例子:把Java程序比作一家餐厅,每个线程就是一名服务员。jstack的输出就是把所有服务员的“工作记录”列出来——有的在正常上菜,有的在等客人点单,有的可能站在原地不动,这就是我们要找的“问题服务员”。
第三步:看懂核心信息,揪出问题
输出里最关键的是“线程状态”和“方法栈”,这俩能直接告诉我们程序卡在哪:
- 如果看到大量线程都显示“BLOCKED”(就像服务员被拦在厨房门口,没法继续上菜),后面跟着的方法名是同一个,比如都卡在“某资源的锁”,那大概率是多个线程抢同一个资源,这就是“死锁”或“资源竞争”的问题;
- 如果某个线程一直显示“RUNNABLE”但停在同一个方法里,比如一直在循环查某个不存在的数据,那可能是程序写了死循环,一直在空转,把性能耗光了。
除了直接输出,还可以加个参数导出成文件,方便后续慢慢分析,比如jstack -l 1234 > thread_dump.txt,这个文件就存了所有线程信息,打开就能慢慢看。
注意几个小细节
别以为只要输命令就万事大吉,有几个关键点要记:
- 必须用和程序同版本的JDK里的jstack,不然可能读不懂输出;
- 分析的时候别只看单个线程,要找“扎堆卡住”的线程,单个线程偶尔卡一下可能是正常逻辑,扎堆才是问题;
- 如果是远程服务器的Java程序,得先远程连接到服务器的终端,才能用jstack,不能直接在本地电脑上查。
就像给身体做体检,jstack就是给Java程序做“线程体检”,不用复杂操作,只要找到PID、输对命令,再看懂核心状态,就能快速定位大部分运行异常的问题。下次再遇到程序突然变慢,不妨试试用这个自带的工具,说不定比找第三方工具更管用。