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占用率过高,说明这几个线程的代码可能有问题,我们选择线程,查看详细信息,进行代码定位:文章来源:https://www.toymoban.com/news/detail-760969.html
可以看到,SecurityTestController.temstcpu100这个方法,定位代码82行,此时,问题得到定位,依次分析解决其他线程即可;文章来源地址https://www.toymoban.com/news/detail-760969.html
到了这里,关于Java 开发,当cpu占用率100%,window和Linux分别如何定位问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!