Java 线程堆栈分析

290 阅读1分钟

线程堆栈

线程堆栈是虚拟机中线程状态的快照

通过线程堆栈日志定位并解决死锁问题

随便写一个死锁程序,打开命令行查看进程编号

image.png

根据死锁程序进程编号查看堆栈信息

image.png

截取关键部分,可以看到死锁的堆栈信息

image.png

死锁形成需要满足的四个条件,解决死锁仅需破坏以下其中之一的条件

条件描述
互斥条件一个资源同时只能被一个线程占用
请求与保持请求资源阻塞时,不会释放已有资源
不剥夺条件资源未使用完之前不能被剥夺
循环等待条件消费者之间形成头尾相接的循环等待资源关系

通过线程堆栈日志检查线程状态

通过以下命令查看线程堆栈不同状态线程的数量

grep java.lang.Thread.State xxx.log | awk '{print $1$2$3$4$5}' | sort | uniq -c

image.png

故障排查步骤

第一步,查找占用率异常的进程

command:top

image.png

第二步,查找占用率异常的线程

command:top -Hp pid

image.png

第三步,将线程编号转换为 16 进制

command:printf "%x\n" pid

image.png

第四步,查看对应线程的堆栈信息

command:jstack pid | grep 'hex pid'

image.png