☆☆☆★☆☆☆

唯有努力才能活成自己想要活成的样子

导航

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 重建

 

posted on 2023-02-07 18:02  Yr-Zhang  阅读(253)  评论(0编辑  收藏  举报