jstack调试java线程(linux)
1、以root用户登入linux,执行命令查看jboss的线程ID
ps -ef | grep java
2、执行jstack指令dump线程
jstack -l 6348 > /opt/dump/6348.dump
报错:-bash: jstack: command not found
原因:java环境变量没有设置
3、设置JAVA环境变量
export PATH=$PATH:/opt/wildfly/java64/jdk1.7.0_25/bin
4、执行jstack指令dump线程
jstack -l 6348 > /opt/dump/6348.dump
报错:
6348: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding
原因:root非jboss线程的拥有者,不能查看
5、切换到jboss线程的拥有者用户jbossuser
sudo -su jbossuser
6、执行jstack指令dump线程输出到文件
jstack -l 212(线程ID) > /opt/212.dump
7、总结
7.1 必须预先设置JAVA环境变量
7.2 必须以线程拥有者身份登录linux
7.3 执行jstack命令
8、分析线程
8.1 线程状态
NEW,未启动的。不会出现在Dump中。
RUNNABLE,在虚拟机内执行的。运行中状态,可能里面还能看到locked字样,表明它获得了某把锁。
BLOCKED,受阻塞并等待监视器锁。被某个锁(synchronizers)給block住了。
WATING,无限期等待另一个线程执行特定操作。等待某个condition或monitor发生,一般停留在park(), wait(), sleep(),join() 等语句里。
TIMED_WATING,有时限的等待另一个线程的特定操作。和WAITING的区别是wait() 等语句加上了时间限制 wait(timeout)。
TERMINATED,已退出的。
8.2 主要是查找BLOCKED状态的线程,根据获得的信息分析原因。
9、在线分析工具:http://fastthread.io/

浙公网安备 33010602011771号