前提:需要模拟一个故障来定位这个故障究竟发生了什么问题。
现在模拟一个高CPU占用率故障,并且将其运行在linux上。
public class mytest1 {
public static void main(String[] args) {
while (true){
System.out.println(Math.random()*10000);
}
}
}
两个命令 javac(编译文件将其转化为.class文件) java(运行.class文件)
自此模拟故障成功,下一步是进行故障排查。
故障排查
1.查看cpu运行状况 使用top命令
发现除系统进程外,还有进程cpu资源消耗率过高,且为java程序。
2.根据提供的进程去定位该进程下具体工作的线程使用命令 ps -mp 进程号 -o THREAD,tid,time(-m显示所有线程 -p pid进程使用的cpu时间 -o该参数后是用户自定义格式)
根据36298线程找到如下数据:
发现线程36299承担进程大部分cpu占用率。
3.进一步查看36299线程下究竟运行的是什么东西。使用命令:jstack 进程号 | grep 线程号(该进程下的工作线程号,需要16进制且小写英文字母) -A60(打印前60行)
16进制转换可以直接使用计算器:
该命令则为:jstack 36298 | grep 8dcb -A60
发现如下数据:
观察到红色框框正是我们之前设置的故障文件(mytest1.java),可是这个6是什么意思呢?
打开文件看看
发现正好是引发cpu占用率过高的代码行数!!
总结:当我们需要查找cpu过高原因的时候,可以通过观察进程—>线程—>代码行数的情况,定位到究竟是哪些代码带来cpu占用过高的问题。