javajava cpu占用高cpu高?

5.在第二步导出的Java.txt中查找转换成为16進制的线程PID找到对应的线程栈。

6.分析负载高的线程栈都是什么业务操作优化程序并处理问题。

2.获取线程信息并找到java cpu占用高CPU高嘚线程

3.将需要的线程ID转换为16进制格式

4.打印线程的堆栈信息

你对这个回答的评价是?

下载百度知道APP抢鲜体验

使用百度知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。

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

在硬着头皮查找资料定位错误修正bug的过程中参考了下面两篇文章:

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

java程序cpujava cpu占用高过高问题分析:(这篇文章中的图片显示不了)

最初想通过java自带的jconsole和jvisualvm来调试,但发现jconsole只能知道应用整体情况不能定位问题,而jvisualvm最哆查找到类

如果所示,但不能更详细的进行定位于是参考了上面两篇文章一步步实现了最终目的。

查找问题进程比较简单因为问题集中在CPU资源java cpu占用高过高,那么我们查找进程时只需关注CPU方法有两种:


下载后运行起来,找到PID为9272的进程

右键点击Properties...选项看到如下信息:

可鉯看到java cpu占用高CPU最多的也是TID为9368和12484的两个线程。

问题定位需要以下步骤:

1、将线程TID转换为十六进制

因为通过jstack工具导出的信息中线程TID是十六进制嘚所以我们首先转换进制,这里通过系统自带的计算器进行转换

记录下2498这个数字。

通过Notepad++工具打开该文档搜索到如下信息,可以看到問题定位到了MQStart.java:174

同理,对于TID=12484的线程也如同以上步骤进行查找找到了170行代码。

由此基本可判断问题就出在了该段代码上

通过以上步骤已經定位到了代码片段,但是这段代码看上去没什么错误查找资料说很多情况是进入死循环了,但是这里确定不会死循环思路似乎进入叻死胡同。

无奈之下我将170行的if内的代码段全注释掉了发现CPU依然飙高,这说明并不是这几行代码的错误然后我if内做了一个输出操作,发現程序快速的不间断的进行输出

看到这个结果我突然醒悟,这段代码虽然没有进入死循环但是循环内的代码并不复杂,而且没必要如此频繁的进行检查操作这中间应该停歇一下。

根据以上分析我修改了这段代码:

再次运行测试发现CPU维持在50%以内。

我要回帖

更多关于 java cpu占用高 的文章

 

随机推荐