本文所述的方法操作简单,但要能快速定位问题,需要一些重复练习和实践。
排查线程死循环
思路
- 通过
top -H -p $pid
列出进程的所有线程,默认是按cpu排序的(可按<或>调整排序字段,我常用的还有TIME+);如果有死循环线程,在未休眠或挂起的情况下(占用一核),将会显示在最上方 - 找到线程,通过
jstack $pid | grep $thread_id -a30
定位到堆栈注:jstack中记录的thread_id是16进制,top拿到的线程ID是10进制,grep时需自行转化
编写脚本
##! /bin/bash
##! 查看某Java线程栈
##! @Ahthor: Will
## 声明提示配色
strong_tip="\033[44m\033[37m"
warn_tip=$strong_tip"\033[05m"
error_tip="\033[41m\033[37m"
tip_ending="\033[0m"
## 获取输入参数
pid=