1.情景展示

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

2.原因分析

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

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

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

  java项目的CPU占有问题。

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

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

3.解决方案

  工具:Process Explorer

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

写在最后

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

相关推荐:

 

最新文章

  1. 7 COMPELLING REASONS YOU NEED TO START THE BUSINESS YOU’VE ALWAYS WANTED
  2. eclipse安装genymotion插件
  3. Java并发编程:进程和线程之由来
  4. [ html canvas 模仿支付宝刮刮卡效果 ] canvas绘图属性 模仿支付宝刮刮卡效果实例演示
  5. linux包之nc之nc命令
  6. java System 常用方法
  7. (转)linux下mysql的安装过程
  8. LDMFD和STMFD个人理解
  9. Android项目包装apk和apk反编译,xml反编译
  10. iOS kvc
  11. css中auto的用法
  12. python基础阶段练习题 拾英札记(1)
  13. Android app性能测试小结(7个性能指标)
  14. MyBatis 与 Spring 整合
  15. android cookie持久化
  16. 操作docker容器
  17. TF之AE:AE实现TF自带数据集数字真实值对比AE先encoder后decoder预测数字的精确对比—Jason niu
  18. draw9patch图片拉伸
  19. C++ new/malloc、delete/free
  20. 【Codeforces 912E】Prime Gift

热门文章

  1. sql server 下载安装标记
  2. cap理论与分布式事务的解决方案
  3. Python学习之路 【目录】
  4. maven工程运行前准备
  5. Google开发者F12工具面板-network详解
  6. React的jsx语法,详细介绍和使用方法!
  7. 以一道ctf学习python脚本
  8. AT+CNUM获取不到手机号
  9. Jmeter在chrome浏览器中录制脚本
  10. vue 开发系列(十) VUE 作用域插槽