Troubleshooting系列-获取JAVA高CPU线程总结

111 阅读1分钟

第一步获取CPU高的进程

top -b -n 1

第二部获取CPU高的线程

top -b -n 1 -p {pid} -H

打印16进制

printf "%x" {pid}

第三部获取线程堆栈

jstack -l {pid}

查看CPU最高的8个线程,并打印出来

top -b -n 1 | grep -E 'java' -A 1 | awk '{print $1, $9}' | sort -k2 -rn | head -n 1|cut -d' ' -f1| xargs -I{} top -b -n 1 -p {} -H|tail -n +8| awk '{print $1, $9}'| sort -k2 -rn|head -n 8|cut -d' ' -f1|xargs printf "%x\n"

每个一段时间获取上述信息并压缩成一个文件

#!/bin/bash

# 定义常量
INTERVAL=5  # 每隔 5 秒执行一次
COUNT=3     # 循环 3 次

# 创建临时目录
TEMP_DIR=$(mktemp -d)

# 循环执行命令
for ((i=1; i<=$COUNT; i++))
do
    # 查找当前 CPU 最高的进程
    top -b -n 1 > $TEMP_DIR/pid_${i}.txt
    pid=$(cat $TEMP_DIR/pid_${i}.txt|grep -E 'java'| awk '{print $1, $9}' | sort -k2 -rn | head -n 1|cut -d' ' -f1)

    # 查找 CPU 最高的线程
    top -b -n 1 -p $pid -H > $TEMP_DIR/pid_stack_${i}.txt
    # 打印16进制线程ID
    cat $TEMP_DIR/pid_stack_${i}.txt|tail -n +8| awk '{print $1, $9}'| sort -k2 -rn|head -n 8|cut -d' ' -f1|xargs printf "%x\n" > $TEMP_DIR/thread_id_${i}.txt

    # 打印线程堆栈
    jstack -l $pid > $TEMP_DIR/stacktrace_${i}.txt
    sleep ${INTERVAL}
done

# 压缩打包文件
#tar -czvf stacktraces.tar.gz $TEMP_DIR/*.txt
zip stacktraces.zip $TEMP_DIR/*.txt

# 删除临时目录
rm -rf $TEMP_DIR