Java进程CPU飙升到800%
最近遇到springboot项目部署cup过高问题,首先代码环境中是实现ApplicationRunner类在run中使用到了线程池;
问题定位步骤:
在liunx命令窗口执行:
1)、首先通过top指令查看当前占用CPU较高的进程PID;
top
2)、查看当前进程消耗资源的线程PID:top -Hp PID
top -Hp 11701
3)、通过print命令将线程PID转为16进制,根据该16进制值去打印的堆栈日志内查询,查看该线程所驻留的方法位置。
printf "%x\n" 11705
4)、使用dk自带命令jstack获取该java进程的线程快照并输入到文件,查看栈信息,定位到线程对应的具体代码。
jstack -l 11701(进程ID) > ./jstack_result.txt
在jstack_result.txt 文件中根据线程好nid搜索对应的线程描述:
定位代码发现如下:
归纳问题一般原因:
1、空循环
可以使用Thread.sleep或者加锁,让线程适当的阻塞
2、在循环的代码逻辑中,创建大量的新对象导致频繁GC;如查询数据库创建大量实体。
可以减少对象的创建数量,或者可以考虑使用 对象池
3、selector空轮巡导致
无效的事件查询到了一定的次数,进行 selector 重建