线程堆栈
线程堆栈是虚拟机中线程状态的快照
通过线程堆栈日志定位并解决死锁问题
随便写一个死锁程序,打开命令行查看进程编号
根据死锁程序进程编号查看堆栈信息
截取关键部分,可以看到死锁的堆栈信息
死锁形成需要满足的四个条件,解决死锁仅需破坏以下其中之一的条件
| 条件 | 描述 |
|---|---|
| 互斥条件 | 一个资源同时只能被一个线程占用 |
| 请求与保持 | 请求资源阻塞时,不会释放已有资源 |
| 不剥夺条件 | 资源未使用完之前不能被剥夺 |
| 循环等待条件 | 消费者之间形成头尾相接的循环等待资源关系 |
通过线程堆栈日志检查线程状态
通过以下命令查看线程堆栈不同状态线程的数量
grep java.lang.Thread.State xxx.log | awk '{print $1$2$3$4$5}' | sort | uniq -c
故障排查步骤
第一步,查找占用率异常的进程
command:top
第二步,查找占用率异常的线程
command:top -Hp pid
第三步,将线程编号转换为 16 进制
command:printf "%x\n" pid
第四步,查看对应线程的堆栈信息
command:jstack pid | grep 'hex pid'