系统CPU过高分析思路和定位

384 阅读1分钟

模拟死循环代码

在服务器中编译执行此段代码



import java.util.Random;
public class circle{

    public static void main(String[] args) {
        while (true){
            System.out.println(new Random(999999));
        }
    }
}

此时,代码运行起来,服务器较卡,CPU占用过高

分析问题步骤和定位

1.先用top命令找出CPU占比最高的

此时可发现CPU占用最高的进程,进程id:9059

2.ps -ef 或者jps进一步定位,得知是一个怎么样的一个后台程序给我们惹事

这里执行:

ps -ef|grep java|grep -v grep

其中grep -v grep是为了去除包含grep的进程行 ,避免影响最终数据的正确性 。结果:

找到了java进程,就可以定位到具体的线程或者代码了

3.定位到具体线程或者代码

指令公司如下:

ps -mp 进程 -o THREAD, tid, time

其中

-m 显示所有的线程

-p pid 表示进程使用CPU的时间

-o 该参数后是用户自定义格式

执行:

ps -mp 9059 -o THREAD,tid,time

显示出上的结果,找到占用CPU最高的那个线程,找出线程id-->TID--->9060

4.将需要的线程ID转换为16进制格式(英文小写格式)(定位到代码的哪一行)

 printf "%x\n" 9060

5102 的16进制是2364

5.jstack进程ID|grep tid (16进制线程ID小写英文)-A60(打印出前60行)

jstack 进程id | grep tid(16进制线程id小写英文)-A60 执行:

jstack 9059 | grep 2364 -A60

从结果上显示,问题代码出现在 at circle.main(circle.java:8),也就是那句输出语句。 以上就是具体的案例分析,