cpu飙升问题排查
wenking 7/26/2023 JVM
# 模拟编写一段高CPU的程序
new Thread(() -> {
while (true) {
log.info("hello, king!");
}
}, "hello-").start();
1
2
3
4
5
2
3
4
5
将这块代码片段放置到我们的程序中。
# 查找CPU占用比最高的进程
top -c
1
此处我使用的是容器部署的环境,所有java进程的PID为1, 生成环境中如果为非容器部署,PID不可能为1
# 查找CPU占用比最高的线程
# top -Hp PID
top -Hp 1
1
2
2
并将CPU占用率最高的线程PID转化为16进制
printf "%x" 26
# 1a
1
2
3
2
3
# 打印java的stack信息
# jstack PID > 重定向文件名
jstack 1 > stack.log
# 筛选出线程ID为 0x1a 的线程调用栈信息
cat stack.log | grep 0x1a -A 20
1
2
3
4
5
2
3
4
5
jstack打印后的堆栈信息第一行参数含义解释:
- tid: java内的线程id
- nid: 操作系统级别线程的线程id
- prio: java内定义的线程的优先级
- os_prio:操作系统级别的优先级
可以看到我们的代码在EntryTest类中的63行出现问题