网站建设与维护 电子版,wordpress栏目指定二级域名,pc端网站生成wap版,承接网站开发 app开发Java服务#xff0c;有时候会遇到CPU 100%的问题#xff0c;对于这样的问题#xff0c;我们如何快速定位并解决呢#xff1f;一般会有如下三个步骤#xff1a;1、找到最耗CPU的进程2、找到这个进程中最耗CPU的线程3、查看堆栈信息#xff0c;定位线程的什么操作消耗了大量…Java服务有时候会遇到CPU 100%的问题对于这样的问题我们如何快速定位并解决呢一般会有如下三个步骤1、找到最耗CPU的进程2、找到这个进程中最耗CPU的线程3、查看堆栈信息定位线程的什么操作消耗了大量CPU定位对应代码下面通过一个实例来详解一下如何快速定位CPU问题系统CentOS 7模拟CPU占用偏高的测试代码public class CpuUseTest {public static void main(String[] args) {new Thread() {public void run() {int result 0;while (true) {result;if (result Integer.MAX_VALUE / 2) {result 0;}}}}.start();}}运行以上代码后通过以下几步来查找CPU问题1、找到最耗CPU的进程通过top命令查看进程的cpu占用情况运行top命令后再键入P(大写p)进程会按照CPU使用率排序如下图最耗cpu进程由上图可以看到最耗CPU的进程PID为2601CPU使用率达到了100%2、找到这个进程中最耗CPU的线程可以使用top命令top -Hp ${进程的PID}也可以使用ps命令ps -mp ${进程的PID} -o THREAD,tid,time我们以top命令为例top -Hp 2601运行以上命令后再键入P(大写p)线程会按照CPU使用率排序如下图最耗cpu线程可以看到进程2601的最耗CPU的线程PID为2611CPU使用率达到了99.9%3、查看堆栈信息定位线程的什么操作消耗了大量CPU定位对应代码堆栈里线程id是用16进制表示的所以需要将线程PID转化为16进制printf %x\n 2611输出a33打印进程堆栈信息(注意2601是进程的PID)通过线程id过滤得到线程堆栈jstack 2601 | grep a33 -A 20输出信息如下堆栈信息由此可以看到最耗CPU的代码为CpuUseTest.java代码中的第9行也就是执行无限循环的代码块所在的位置。直此导致该应用CPU偏高的问题被成功定位。4、查看堆栈信息中遇到的问题刚开始查看堆栈信息的时候使用了如下命令(请跟上面的命令对比一下看看有什么不同)jstack 2611 | grep a33 -A 20结果报错堆栈信息报错是的我把该写进程PID的地方写成了线程PID找了一圈才解决这个问题也耗费了不少时间。