0


Java 开发,当cpu占用率100%,window和Linux分别如何定位问题

Linux篇

导言
Java服务,有时候会遇到CPU 100%的问题,对于这样的问题,我们如何快速定位并解决呢?一般会有如下三个步骤:

找到最耗CPU的进程
找到这个进程中最耗CPU的线程
使用jdk自带工具jstack 查看堆栈信息,定位线程的什么操作消耗了大量CPU,定位对应代码

Java程序CPU占用过高(100%)解决思路和解决方案

一、找到最耗CPU的进程

通过top命令查看进程的cpu占用情况,运行top命令后再键入P(大写p)(或者是 shift + p ),进程会按照CPU使用率排序,我们查找到的最耗CPU的进程,应用程序为Java,CPU使用率达到了100%,则说明这是我们要找的对象;记录好该应用程序的进程id

二、找到这个进程中最耗CPU的线程

可以使用top命令:top -Hp ${进程的PID}

运行以上命令后再键入P(大写p),线程会按照CPU使用率排序
注意线程和进程的概念的区别

三、查看堆栈信息,定位线程的什么操作消耗了大量CPU,定位对应代码

堆栈里,线程id是用16进制表示的,所以需要将线程PID转化为16进制:

printf “%x” ${线程id}
之后Linux会输出转化后的结果

打印进程堆栈信息,通过线程id,过滤得到线程堆栈:

jstack ${进程的id} | grep ${线程16进制结果} -A 20

命令行执行后,可以查找到最耗CPU的代码为某个类的代码中的问题行数,由此问题得到定位,分析相应代码进行处理即可。

windows篇

补充工具

一、查找进程
查找问题进程比较简单,因为问题集中在CPU资源占用过高,那么我们查找进程时只需关注CPU。
打开JVisualVM,在Applications(中文版写的应用程序)面板中即可看到应用所在进程的PID8596和11556。在这里插入图片描述

需要注意的是该工具并不能定位到线程。
二、查找线程
根据进程查找线程,有两种方法。
1、使用window自带命令pslist

首先确认系统是否安装了pslist命令程序,如果命令不识别即没有安装,则上微软官方网址http://technet.microsoft.com/en-us/sysinternals/bb896682.aspx下载,下载完将其解压到C:\Windows\System32路径下即可使用。
在这里插入图片描述

2、利用微软提供的Process Explorer工具(推荐使用这个工具,可视化界面看起来很方便)
一般在windows下只能查看进程的CPU占用率,想要查看线程的CPU占用率可以通过该工具。下载地址是:http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

下载后运行起来,找到PID为8596的进程

右键点击Properties…选项,看到如下信息:
在这里插入图片描述

可以看到占用CPU最多的也是TID为20728的线程。
三、问题定位
问题定位需要以下步骤:
1、将线程TID转换为十六进制
因为线程dump信息中线程TID是十六进制的(堆dump也是这样),所以我们首先转换进制,这里通过系统自带的计算器进行转换。

记录下50F8这个数字。
2、在JVisualVM中的中线程dump中查找“50F8”
在JVisualVM中,应用程序右击,找到“线程Dump”

在这里插入图片描述
在这里插入图片描述

全选复制出来,通过Notepad++工具打开该文档,搜索“50F8”,可以看到问题定位到了具体的哪一行。(因为我程序是修改过的,所以CPU占用并没有太大问题,自然也就定位到正常的JVM处)

在这里插入图片描述

最后根据定位的位置去找问题就可以啦~~~·

直接使用jdk提供的工具jmc.exe

从window任务管理器可以看到
在这里插入图片描述
在这里插入图片描述

此时Java的cpu使用率飙高,(记住该pid进程号,后面会用到)打开jdk包安装目录
在这里插入图片描述

进入bin目录后找到jmc程序打开
在这里插入图片描述

可以看到所有java进程的列表程序

在这里插入图片描述对照进程号,点进去
在这里插入图片描述

之后等待右边窗口加载,因为cpu使用率已经过高,所以会有些卡顿,请耐心等待一下;
在这里插入图片描述
加载后可以看到左下角有各种选项卡,我们选择线程;
在这里插入图片描述
在这里插入图片描述

可以看到此时工具正在跟踪线程的堆栈,由于cpu概要分析没有勾上,所以此时cpu总体占用率显示未启用,我们将勾上后进行排序;
在这里插入图片描述

可以看到示例中有6个线程的cpu占用率过高,说明这几个线程的代码可能有问题,我们选择线程,查看详细信息,进行代码定位:在这里插入图片描述

可以看到,SecurityTestController.temstcpu100这个方法,定位代码82行,此时,问题得到定位,依次分析解决其他线程即可;

标签: linux java jvm

本文转载自: https://blog.csdn.net/aaroncgt/article/details/129400061
版权归原作者 aaroncgt 所有, 如有侵权,请联系我们删除。

“Java 开发,当cpu占用率100%,window和Linux分别如何定位问题”的评论:

还没有评论