cpu飙升问题排查

7/26/2023 JVM

# 模拟编写一段高CPU的程序

new Thread(() -> {
    while (true) {
        log.info("hello, king!");
    }
}, "hello-").start();
1
2
3
4
5

将这块代码片段放置到我们的程序中。

# 查找CPU占用比最高的进程

top -c
1

cpu飙高问题排查查找cpu占用率最高的进程

此处我使用的是容器部署的环境,所有java进程的PID为1, 生成环境中如果为非容器部署,PID不可能为1

# 查找CPU占用比最高的线程

# top -Hp PID
top -Hp 1
1
2

cpu飙高问题排查查找cpu占用率最高的几个线程

并将CPU占用率最高的线程PID转化为16进制

printf "%x" 26

# 1a
1
2
3

# 打印java的stack信息

# jstack PID > 重定向文件名
jstack 1 > stack.log

# 筛选出线程ID为 0x1a 的线程调用栈信息
cat stack.log | grep 0x1a -A 20
1
2
3
4
5

cpu飙高问题排查打印CPU占用最高线程栈信息

jstack打印后的堆栈信息第一行参数含义解释:

  • tid: java内的线程id
  • nid: 操作系统级别线程的线程id
  • prio: java内定义的线程的优先级
  • os_prio:操作系统级别的优先级

可以看到我们的代码在EntryTest类中的63行出现问题

cpu飙高问题排查存在问题的代码片段