java linux环境cpu 100%问题排查

268 阅读1分钟

编写死循环代码

// 如果不注释 运行代码是 报错找不到主类
//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文件

图片.png

java fortest 运行注意这里不能代.class后缀否则会报错找不到主类,如下图

图片.png

运行后,打开另一个窗口进行排查问题

通过 top命令查看cpu 内存的状态,显示99.9%

图片.png

两种方法

第一种: 1:通过jsp(JDK自带的)命令查看java 运行的 PID 能够看的我们运行的java类 fortest

图片.png

2:执行jstack pid >> javaerror.txt 导出CPU占用的线程栈

图片.png

3: 通过命令 top -H -p PID 查看java的那个线程占用cpu高,如图13385 线程占用高

图片.png

4:线程13385是十进制的转化为16进制 printf "%x\n" 13385 16进制为 3449

图片.png

5:在第二步导出的javaerror.txt 找出来3449的线程栈,可以看出来那一行代码出错。

图片.png

第二种:

1:通过 top 命令查询cpu占用高的PID

图片.png

2:获取线程信息,并找到占用cpu线程高的线程

ps -mp pid -o THREAD,tid,time | sort -rn

图片.png

3:将TID 转换成16进制 printf "%x\n" 13385

图片.png

4:打印线程的堆栈信息 jstack 13385 |grep 3449 -A 30

图片.png

一般来说对于一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环。