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

1.情景展示

00b123897ebd953a771e1766a470f8ff.png

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

2.原因分析

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

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

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

java项目的CPU占有问题。

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

021467d05ee50a2b4518b870ad81416e.png

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

3.解决方案

工具:Process Explorer

0f7f118a64a6b821f416507a0be2e2b3.png

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

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

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

8c416d1581bb03d02e51a3aba55327c4.png

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

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

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

688cc032c9899c8c0dd710d20dd4de22.png

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

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

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

e7667cfbe7eacc9d378c4442f3f06488.png

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

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

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

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

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

9eb51970409147919df38bf18b44b0ef.png

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

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

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

写在最后

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

相关推荐:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值