如何回答“线上CPU100%排查”面试问题
案例:
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情况:
使用 top -Hp 126018 查看一个进程的线程运行信息列表,可按下P,进程按照cpu使用率排序
上图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)
执行过程中遇到的如下问题:
不积跬步无以至千里不积小流无以成江海