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/

posted @ 2018-09-15 16:41  havery  阅读(446)  评论(0)    收藏  举报