编写死循环代码
// 如果不注释 运行代码是 报错找不到主类
//package com.example.demo;
/**
* @author wangxy
* @date 2021/11/30 9:54
*/
public class fortest {
public static void main(String[] args) {
int i=1;
while (true) {
i++;
}
}
}
放到linux上编译
javac fortest.java
生成一个class文件
java fortest 运行注意这里不能代.class后缀否则会报错找不到主类,如下图
运行后,打开另一个窗口进行排查问题
通过 top命令查看cpu 内存的状态,显示99.9%
两种方法
第一种: 1:通过jsp(JDK自带的)命令查看java 运行的 PID 能够看的我们运行的java类 fortest
2:执行jstack pid >> javaerror.txt 导出CPU占用的线程栈
3: 通过命令 top -H -p PID 查看java的那个线程占用cpu高,如图13385 线程占用高
4:线程13385是十进制的转化为16进制 printf "%x\n" 13385 16进制为 3449
5:在第二步导出的javaerror.txt 找出来3449的线程栈,可以看出来那一行代码出错。
第二种:
1:通过 top 命令查询cpu占用高的PID
2:获取线程信息,并找到占用cpu线程高的线程
ps -mp pid -o THREAD,tid,time | sort -rn
3:将TID 转换成16进制 printf "%x\n" 13385
4:打印线程的堆栈信息 jstack 13385 |grep 3449 -A 30
一般来说对于一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环。