windows 排查javaWeb程序占用CPU过高问题(可追踪到问题代码所在行)
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高的线程也按这种方式进行排查即可。
windows 排查javaWeb程序占用CPU过高问题(可追踪到问题代码所在行)的更多相关文章
- 服务器CPU又爆了?Linux快速排查Java程序占用CPU很高的方法
这个问题可以说是 Java 面试的高频面试题了,有很多面试官都喜欢问这个问题,问题可能是下面这样的. 线上一台服务器 CPU 使用率100% 了,如果你碰到这样的情况,如何排查并找到问题原因? 1.场 ...
- Linux排查Java程序占用CPU很高的解决办法
Java的工具集相当强大,学习成本也很低,处理线上问题时,jstack这个工具就比微软的windbg,好学好用很多,3步找出占用CPU很高的源所在.而windbg反人类的各种命令,实在不敢恭维. 故意 ...
- Linux排查java程序占用cpu过高的线程代码
分几步骤: 1.通过top,查出占用CPU过高的java进程 ,比如: pid :6666 2.通过ps -mp 6666 -o THREAD,tid,time| sort -n -k1 -r 查看此 ...
- windows下揪出java程序占用cpu很高的线程 并找到问题代码 死循环线程代码
我的一个java程序偶尔会出现cpu占用很高的情况 一直不知道什么原因 今天终于抽时间解决了 系统是win2003 jvisualvm 和 jconsole貌似都只能看到总共占用的cpu 看不到每个线 ...
- Windows服务器java.exe占用CPU过高问题分析及解决
最近在测试一个用java语言实现的数据采集接口时发现,接口一旦运行起来,CPU利用率瞬间飙升到85%-95%,一旦停止就恢复到40%以下,这让我不得不面对以前从未关注过的程序性能问题. 在硬着头皮查找 ...
- 线上Java程序占用 CPU 过高,请说一下排查方法?
我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...
- windows下揪出java程序占用cpu很高的线程
背景 天天搞java,这些监控也都知道,用过,但也没往细里追究.因为也没碰见这种问题,这次还是静下来走一遍流程吧.与网上基本一致,不过我区分了下linux和windows的不一样.我感觉基本是程序写成 ...
- JVM进程占用CPU过高问题排查
上午收到报警,某台机器上的CPU负载过高,通过逐步的排查,解决了问题,下面记录一下整个排查的过程. 首先,登录上对应的机器,通过top命令找到占用CPU过高的进程ID,也就是PID,为29126, 然 ...
- 记一次java程序占用cpu超高排查
1.首先通过top命令查看占用cpu过高的pid #top top - 18:07:25 up 48 days, 1:07, 3 users, load average: 11.94, 11.9 ...
随机推荐
- springboot单元测试@test的使用
@RunWith(SpringRunner.class) @SpringBootTest(classes = Application.class) public class Springtest { ...
- C# 中一个限制 Task 并发执行的数量的示例
直接贴代码了: using System; using System.Linq; using System.Threading; using System.Threading.Tasks; class ...
- kali渗透综合靶机(十一)--BSides-Vancouver靶机
kali渗透综合靶机(十一)--BSides-Vancouver靶机 靶机下载地址:https://pan.baidu.com/s/1s2ajnWHNVS_NZfnAjGpEvw 一.主机发现 1.n ...
- C# WebAPI 文件在线预览
最近在写一个移动端API接口,其中有一个需求:接口返回附件url地址让手机端调用实现文件在线预览.大体实现思路:把doc.xls等文本格式文件转换为pdf,转换后的pdf文件存放在服务器上面,方便第二 ...
- 使用三层架构+EF添加单元测试
在运行测试的时候抛异常了: “System.InvalidOperationException”类型的异常在 mscorlib.dll 中发生,但未在用户代码中进行处理 The Entity Fram ...
- php CI如何实现全站静态生成html,动态创建目录
php CI如何实现全站静态生成html,动态创建目录CodeIgniter框架生成HTML的方法 public function out_html($code) { $data['articles' ...
- ANDROID培训准备资料之Service
在讨论Service 之前,我们需要了解两点,非常重要的两点 (1) Service 不会专门启动一条单独的进程,Service与它所在应用位于同一个进程中 (2) Service也不 ...
- mybatis if-else用法
demo: <select id="queryRuralCodes" resultType="string" parameterType="ma ...
- java 并发编程面试题及答案
1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon( ...
- SQL Server 使用union all查询多个条件数据合并分组显示,同比统计
),a.created_yearmonth,) created_yearmonth, a.countaccount countaccount, a.yxsl yxsl, a.sccdsl sccdsl ...