java cpu飙升居高不下,这种事情虽然很少。
但是这种故障一旦发生了,可能就很严重。
那么当我们某个Java项目占比很高了,怎么定位到代码?
1. top
使用top 定位到占用CPU高的进程PID
2. 通过ps aux | grep PID命令
获取线程信息,并找到占用CPU高的线程
ps -mp "$PID" -o THREAD,tid,time | sort -rn -k 2 | head
3. 将需要的线程ID转换为16进制格式
printf "%x\n" tid
4. 打印线程的堆栈信息 到了这一步具体看堆栈的日志来定位问题了
jstack pid |grep tid -A 30
5. 脚本
#!/bin/bash
# 进程pid
PID="$1"
# 线程tip
TIP="$2"
# grep 显示匹配后和它后面的n行
GREP_A="$3"
TIP_SHOW() {
ps -mp "$PID" -o THREAD,tid,time | sort -rn -k 2 | head
}
# 判断是否有$TIP 没有就打印出来
if [ -z "$TIP" ] ;then
TIP_SHOW
else
TIP_16=$(printf "%x\n" $TIP)
echo -e "\033[32m $TIP_16 \033[0m"
# 判断是否有GREP_A变量
if [ -z "GREP_A" ]; then
GREP_A=30
fi
jstack $PID | grep $TIP_16 -A $GREP_A
fi
发表评论
共 0 条评论
暂无评论