4、CPU问题查看

1、简述

  当程序中出现死循环,或者计算量很大的线程的时候,就会导致Java程序进程占用大量CPU资源,从而可能导致程序挂掉,此文从实例进行概述具体的查询占用CPU资源高的程序代码。

2、排查步骤

(1)查看占用CPU高的进程

  • top命令

(2)查看进程中占用CPU最多的线程。

  • top -Hp ${pid} 命令(PID表示进程ID,排列靠前的几个基本都是此进程下最占用CPU资源的线程)

(3)将进程信息转出到文件。

  • jstack -l {pid} >{file.log}

(4)将线程ID转成16进制。

  • printf ‘%x\n’ ${TID} 命令(TID表示线程ID)

(5)根据16进制线程ID在3中输出的file.log中找到对应线程的息更具体代码信息。

3、示例

3.1、示例代码

  写一个死循环,来模仿占用CPU资源,然后进行问题排查。

public class CPUTestDemo {
    public static void main(String[] args) {
        int i = 0;
        while (true) {
            i++;
        }
    }
}

3.2、排查

1、top命令查看当前占用CPU资源最高的进程,如下图:

top命令.png

  从图中可以看出进程5278所占用的CPU资源99.5%,并且从COMMAND能看出确实是启动的Java进程,说明Java程序中存在问题,导致狂占CPU资源。

2、对1中得到的占用CPU资源高的进程执行top -Hp 5278,得到此Java进程内最占用CPU资源的线程,如下图:

top-Hp.png

  从图中可以看出线程5279所占用的CPU资源99.6%,这就可以明确的定位到Java程序中占用CPU资源的线程号5279。

3、对2中得到的占用CPU资源高的线程号执行printf ‘%x\n’ 5279,得到线程号的十六进制值149f,如下图:

printf 命令.png

4、通过jstack -l 5278 > file.log 重定向输出Java进程的jstack日志。

5、通过对3中得到的线程十六进制值,在4)的file.log中查找线程中具体的占用CPU资源的代码信息,如下图:

file.png

  从图中可以看出线程0x149f主线程中具体的占用CPU资源的代码行,定位到文字开始的实例代码,可以看到正常程序中的while死循环造成的CPU资源占用过高,从而定位代码问题。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容