windows 排查javaWeb程序占用CPU过高问题(可追踪到问题代码所在行)

时间:2023-01-07 00:21:07
 

1.情景展示

windows 排查javaWeb程序占用CPU过高问题(可追踪到问题代码所在行)

  java虚拟机占用这么高的CPU,肯定不正常!  

2.原因分析

  第一个是tomcat,正在运行java项目;

  第二个是eclipse,因为eclipse的运行依赖于java。

  现在的问题是:tomcat的CPU使用率达到了90%,单独运行tomcat是不可能占用这么多CPU的,所以,问题就出现在:

  java项目的CPU占有问题。

  既然知道项目有问题,那就需要排查项目中具体哪个java类中的哪行代码出了问题。

windows 排查javaWeb程序占用CPU过高问题(可追踪到问题代码所在行)

  将第一个应用程序也就是tomcat关闭后,CPU立马会降下来,这进一步证实了:是项目的问题。

3.解决方案

  工具:Process Explorer

windows 排查javaWeb程序占用CPU过高问题(可追踪到问题代码所在行)

  第一步:查看最占CPU程序所对应的pid

  打开该应用,第二栏就是CPU,默认将程序按照CPU的占有率进行倒序排列,即:最占CPU的程序会排在最前面。

  这个程序也就是tomcat,右侧有个pid列,其对应的值是:12240

windows 排查javaWeb程序占用CPU过高问题(可追踪到问题代码所在行)

  第二步:保存程序的线程信息

  打开DOS命令窗口,在cmd命令窗口中执行命令:jstack 12240 > C:\Users\Marydon\Desktop\problem.log。

  该命令的作用是将PID为12240的程序所包含的所有线程信息,保存在本地C:\Users\Marydon\Desktop\problem.log文件中。

windows 排查javaWeb程序占用CPU过高问题(可追踪到问题代码所在行)

  第三步:查看占用CPU的线程

  Process Explorer中,选中最占用CPU的那个应用(javaw.exe)--》右键Properties--》切换到Threads栏--》默认将线程按CPU进行倒序排列。

  每行都代表一个线程,tid代表的就是该线程所对应的线程id(十进制)。

windows 排查javaWeb程序占用CPU过高问题(可追踪到问题代码所在行)

  第四步:在线程文件中查找该线程id

  根据该tid去log文件中查找,就能找到该线程所对应的java代码。

  由于,刚才导出的log文件中,存储的线程id是16进制的,而我们在Process Explorer中看到的是10进制的tid,所以,我们需要将十进制转换成16进制。

  以tid=12352的线程为例,转换成十六进制后为3040。

  打开刚才的log文件,查找3040(0x3040)

windows 排查javaWeb程序占用CPU过高问题(可追踪到问题代码所在行)

  意思是:WindowsSelectorImpl.java的第296行在使用该线程(也就是占内存的代码所在)

  去javaWeb项目中,打开WindowsSelectorImpl.java文件,跳到第296行,就是问题所在。

  同样的,对其它占用CPU高的线程也按这种方式进行排查即可。

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

相关推荐:

 

windows 排查javaWeb程序占用CPU过高问题(可追踪到问题代码所在行)的更多相关文章

  1. 服务器CPU又爆了?Linux快速排查Java程序占用CPU很高的方法

    这个问题可以说是 Java 面试的高频面试题了,有很多面试官都喜欢问这个问题,问题可能是下面这样的. 线上一台服务器 CPU 使用率100% 了,如果你碰到这样的情况,如何排查并找到问题原因? 1.场 ...

  2. Linux排查Java程序占用CPU很高的解决办法

    Java的工具集相当强大,学习成本也很低,处理线上问题时,jstack这个工具就比微软的windbg,好学好用很多,3步找出占用CPU很高的源所在.而windbg反人类的各种命令,实在不敢恭维. 故意 ...

  3. Linux排查java程序占用cpu过高的线程代码

    分几步骤: 1.通过top,查出占用CPU过高的java进程 ,比如: pid :6666 2.通过ps -mp 6666 -o THREAD,tid,time| sort -n -k1 -r 查看此 ...

  4. windows下揪出java程序占用cpu很高的线程 并找到问题代码 死循环线程代码

    我的一个java程序偶尔会出现cpu占用很高的情况 一直不知道什么原因 今天终于抽时间解决了 系统是win2003 jvisualvm 和 jconsole貌似都只能看到总共占用的cpu 看不到每个线 ...

  5. Windows服务器java.exe占用CPU过高问题分析及解决

    最近在测试一个用java语言实现的数据采集接口时发现,接口一旦运行起来,CPU利用率瞬间飙升到85%-95%,一旦停止就恢复到40%以下,这让我不得不面对以前从未关注过的程序性能问题. 在硬着头皮查找 ...

  6. 线上Java程序占用 CPU 过高,请说一下排查方法?

    我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...

  7. windows下揪出java程序占用cpu很高的线程

    背景 天天搞java,这些监控也都知道,用过,但也没往细里追究.因为也没碰见这种问题,这次还是静下来走一遍流程吧.与网上基本一致,不过我区分了下linux和windows的不一样.我感觉基本是程序写成 ...

  8. JVM进程占用CPU过高问题排查

    上午收到报警,某台机器上的CPU负载过高,通过逐步的排查,解决了问题,下面记录一下整个排查的过程. 首先,登录上对应的机器,通过top命令找到占用CPU过高的进程ID,也就是PID,为29126, 然 ...

  9. 记一次java程序占用cpu超高排查

    1.首先通过top命令查看占用cpu过高的pid #top top - 18:07:25 up 48 days,  1:07,  3 users,  load average: 11.94, 11.9 ...

随机推荐

  1. Silverlight 后台设置 button 纯色背景

    silverlight Button直接设置其background为某一颜色往往达不到效果.因为其内置模板把按钮背景弄成一个渐变画刷.所以想要纯色的背景就修改其模板. 在后台修改模板的代码如下: St ...

  2. opencv 比较直方图方式 进行人脸检测对比

    完整opencv(emgucv)人脸.检测.采集.识别.匹配.对比 //成对几何直方图匹配               public static string MatchHist()         ...

  3. 【BZOJ 3143】【Hnoi2013】游走 期望+高斯消元

    如果纯模拟,就会死循环,而随着循环每个点的期望会逼近一个值,高斯消元就通过列方正组求出这个值. #include<cstdio> #include<cctype> #inclu ...

  4. 用gd库画矩形和椭圆

    画矩形:bool imagerectangle ( resource $image画布资源 , int $x1左上角的坐标 , int $y1 , int $x2 右下角坐标, int $y2 , i ...

  5. String类的重要方法与字段

    1.Length():获取当前字串长度 2.charAt(int index):获取当前字符串对象下标index处的字符 3.getChars():获取从指定位置起的子串复制到字符数组中 参数:int ...

  6. Django之路由分发和反向解析

    一.路由分发: 路由分发是指:总路由不再直接做路由与视图函数的对应关系,而是将获取的路由分发给下面的app去处理对应关系 from django.conf.urls import url,includ ...

  7. SWUST OJ&lpar;1035&rpar;

    定位顺序表中最大和最小值 #include<iostream> #include<cstdlib> using namespace std; int main(int argc ...

  8. directive例子1

    (function() { 'use strict'; angular.module('app.widgets') .directive('confirm', ['confirm2', 'toastr ...

  9. 公钥,密钥,HTTPS详解

    公钥与私钥,HTTPS详解 1.公钥与私钥原理1)鲍勃有两把钥匙,一把是公钥,另一把是私钥2)鲍勃把公钥送给他的朋友们----帕蒂.道格.苏珊----每人一把.3)苏珊要给鲍勃写一封保密的信.她写完后 ...

  10. swing自定义border

    public class MyBorder extends AbstractBorder { private static final long serialVersionUID = 1L; priv ...