如何回答“线上CPU100%排查”面试问题

时间:2023-01-24 18:01:52

案例:

public class App 
{
    public static void main( String[] args )
    {
        int a = 0;
        while (a < 100) {
            a *= 10;
        }
    }
}

把上述代码放到项目中,打成jar包,然后丢到服务器上,使用java -jar xxx.jar命令运行jar包;

使用 top -c  查看cpu情况:

如何回答“线上CPU100%排查”面试问题

使用 top -Hp 126018 查看一个进程的线程运行信息列表,可按下P,进程按照cpu使用率排序

如何回答“线上CPU100%排查”面试问题

上图pid是十进制的数据,需要将其转为十六进制,使用命令 printf '%x' 126019 输出 :1ec43

[appdeploy@CNSZ22VL3901:/home/appdeploy]$printf '%x' 126019
1ec43

 

 

使用命令将进程快照导出:

jstack -l 126018 > ./126018.stack

 

然后使用less命令查看线程1ec43干了什么:

"main" #1 prio=5 os_prio=0 tid=0x00007f9eac008800 nid=0x1ec43 runnable [0x00007f9eb294a000]
   java.lang.Thread.State: RUNNABLE
        at com.sf.App.main(App.java:13)

   Locked ownable synchronizers: - None

"VM Thread" os_prio=0 tid=0x00007f9eac0f9000 nid=0x1ec46 runnable 

"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007f9eac01d800 nid=0x1ec44 runnable 

"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00007f9eac01f800 nid=0x1ec45 runnable 

"VM Periodic Task Thread" os_prio=0 tid=0x00007f9eac155000 nid=0x1ec4d waiting on condition 

JNI global references: 9

从上面日志可以看出该线程存在死锁《Locked ownable synchronizers》,具体代码:com.sf.App.main(App.java:13)

 

执行过程中遇到的如下问题:

no main manifest attribute, in demo-1.0.jar