一、面试通过进程和线程
首先,测试需要知道哪个进程占用CPU比较高;其次,何找需要知道占用CPU高的到C的原那个进程中的哪些线程占用CPU比较高;然后,需要知道这些线程的飙升stack trace。
二、面试通过堆栈和应用日志
找出了CPU占用高的测试线程号和其stack trace并再结合应用日志基本上就可以找到问题根源。接下来,何找将介绍相应的到C的原工具来找到这些问题的答案。
四、飙升通过工具
4.1、面试top和pgrep
通过top和pgrep来查看系统中Java进程的测试CPU占用情况。命令如下:
top -p `pgrep -d ,何找 java`
其中pgrep是显示系统中java应用的进程号,top -p是到C的原只显示这些进程的信息。记录下CPU占用率最高的飙升那个进程号。
4.2、通过top来查看进程中CPU占用最高的那些线程,命令为:
top -Hp X
这里,假定X为占用CPU高的进程号。-H是显示该进程中线程的CPU占用情况。同样,记录下CPU占用率高的那些线程号。
4.3、然后,通过jstack导出Java应用中线程的stack trace,命令如下
jstack X
这里是最关键的一步,需要把第2步中的线程号和jstack输出结果中的线程号关联起来。因为top中显示的线程号是10进制,jstack的输出结果中的线程号是16进制,所以只需要把top中看到线程号转换成16进制,然后到jstack的输出结果中即可找到对应线程的stacktrace了。
小结一下,我们通过top和jstack来找到CPU占用高的线程的stack trace,其中最关键的是上述第3步中如何将top中观测到的线程号关联到jstack的输出的stack trace。
五、垃圾回收线程CPU 高的原因分析:
系统内存溢出,可以查看gc日志,是否是一直在进行FULL GC,如果是,可以尝试调整JVM的参数。或者使用 jmap -dump:format=b,file=dumpFileName pid,把内存转存下来,借助工具找到内存溢出的位置。
六、业务处理线程CPU高的原因分析:
查看交易是否有死循环逻辑,或者其他不合理的逻辑