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