Java进程CPU飙升到900%,怎么处理?

提问者:帅平 问题分类:面试刷题
Java进程CPU飙升到900%,怎么处理?
1 个回答
深海少女心
深海少女心
定位过程:
CPU飙升问题定位的一般步骤是:
首先通过top指令查看当前占用CPU较高的进程PID;
查看当前进程消耗资源的线程PID:top -Hp PID
通过print命令将线程PID转为16进制,根据该16进制值去打印的堆栈日志内查询,查看该线程所驻留的方法位置。
通过jstack命令,查看栈信息,定位到线程对应的具体代码。
分析代码解决问题。

处理过程:
如果是空循环,或者空自旋。
处理方式:可以使用Thread.sleep或者加锁,让线程适当的阻塞。
在循环的代码逻辑中,创建大量的新对象导致频繁GC。比如,从mysql查出了大量的数据,比如100W以上等等。
处理方式:可以减少对象的创建数量,或者,可以考虑使用 对象池。
其他的一些造成CPU飙升的场景,比如  selector空轮训导致CPU飙升 。
处理方式:参考Netty源码,无效的事件查询到了一定的次数,进行 selector 重建。
发布于:3个月前 (03-26) IP属地:未知
我来回答