Title

排查Java进程占用CPU高的原因

背景

一般java程序占用cpu内存都不会太高,出现占用高的情况,第一反应就是,进程在某个地方死循环了。

排查

    1. top -Hp 15057 查看下进程中的线程资源占用情况

由上图可见,CPU时间片主要是被15393 这个线程给吃掉了, 所以目标锁定在 15393。

执行 printf "%x\n" 15393,计算出线程ID对应的16进制。

    1. 执行 sudo -u www jstack 15057,获取当前进程中各线程的调用栈

对比之前计算出来的二进制id:3c21,找到占用CPU资源最高的线程堆栈,如上图所示。

看样子是在LoguUtil的255行出了问题,赶紧定位到这一行看看:

这里写了一个死循环,并在255行调用了阻塞队列的poll(),很明显,方法调用错了,poll()在队列会空的时候会直接返回null,并不会阻塞等待,所以造成进程一直在这儿死循环。

那么为什么测试的时候没有发现呢?因为只要有日志,代码很难走到255行,之所以能发现这个问题,是因为我登录机器这段时间是在深夜,刚好没有日志。

验证

将代码修改提交部署后,在登录机器看看CPU占用情况:

此时Java进程的CPU占用已经恢复正常了。


原文章地址:
https://mp.weixin.qq.com/s/HusklYs69fP8VXDUxht3zQ

posted @ 2024-12-20 13:26  快乐小洋人  阅读(5)  评论(0编辑  收藏  举报