前言
在线上环境中你一定遇到过 java 程序停顿、CPU100%、死锁等疑难杂症,作为一名 java 外科手术师,怎么分析问题成了关键,就跟去医院看病一样,如何给 java 程序拍个 X 光片呢?
Java 线程状态机
jstack 概述
jstack 用于生成 JVM 当前时刻的线程快照。线程快照是当前 java 虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。线程出现停顿的时候可以通过 jstack 来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。
jstack 用法
jstack [ option ] PID
基本参数:
- -F 当 jstack [-l] PID 没有响应的时候强制打印栈信息。
- -l 长列表,打印关于锁的附加信息,例如属于 java.util.concurrent 的 ownable synchronizers 列表。
- -m 打印 java 和 native c/c++框架的所有栈信息, -h | -help 打印帮助信息
- PID 需要被打印配置信息的 java 进程 id,可以用 jps 工具查询。