添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

jstack -l #进程id#| grep #16进制线程id#

5. 开始分析线程堆栈

先复习一下线程的各种状态, 包括 NEW(新建), Runnable(可运行), Running(运行) ,Block(阻塞), Dead(死亡) 其中阻塞还分为 等待阻塞、同步阻塞。 转换关系如下图:

(图片来自 https://my.oschina.net/mingdongcheng/blog/139263 )

接下来看一下jstack打出来的线程堆栈,大概是这样的:

"Timer-0" #25 daemon prio=5 os_prio=31 tid=0x00007fd051bb1800 nid=0xfabb in Object.wait() [0x0000700008e90000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at java.lang.Object.wait(Object.java:502)
	at java.util.TimerThread.mainLoop(Timer.java:526)
	- locked <0x00000007a22af328> (a java.util.TaskQueue)
	at java.util.TimerThread.run(Timer.java:505)
   Locked ownable synchronizers:
	- None

需要重点关注有没有以下几个状态:

  • DeadLock 死锁
  • Waiting on Condition 资源等待
  • Blocked 阻塞 具体的case分析可以参考这篇文章 Java线程Dump分析工具—jstack - 残雪余香 - 博客园
  •