
问题: Java应用程序的CPU使用率仍然很高
一般结论: 一般来说,没有为CPU使用率高或低的问题提供一个值,例如,如果该值大于90%,则认为该值很高,以下是正常现象. 通常,在程序运行时,CPU会不断变化. 百分之几,百分之几十和百分之一百是可能的,而连续不断的高CPU使用率(例如300%或更多的800%(多核))可以认为是CPU使用率高的问题.
对于Java,频繁的IO读写,创建太多的线程,CPU会更高,而线程死锁或死循环基本上是导致CPU过多的元凶.
特定问题的介绍: 联通官方环境中的CPU在运行10分钟后达到300%,并在运行一天后继续达到800%
主机环境: RedHatEnterpriseLinuxServerrelease5.6(Tikanga)

JDK: jdk1.6.0_6
tomcat: apache-tomcat-6.0.20
问题定位过程:
1,找到JAVA进程
ps -ef | grep Java


2. 检查系统的运行情况
顶部找到相应的java程序,检查cpu情况,下图是,问题解决后的系统操作

3. 查找可疑的执行线程

在顶部监视页面上,按shift + h切换到线程监视状态,如下所示

有10个以上的Java线程,它们占用100%的CPU并运行100分钟以上. 这样的线程是可疑线程
4. 定位线程执行的特定代码
在其中找到线程12293,将其转换为十六进制小写字母,十六进制为3005,执行

jstack java进程| grep -A 30 3005,如下:

这时,您基本上可以看到该线程专门执行一些代码信息. 如果幸运的话java程序占用cpu过高,您可以直接看到特定的功能代码,但是不幸的是,看不到特定的功能.
5. 找到有问题的功能并查看功能代码
在上图中,我们可以看到有关应在corba中使用的函数的一些信息,但是此范围太大,如何找到该函数?我看了很长时间,终于找到了一种方法,我们知道线程正在运行的时间,我们知道当前时间,然后减去运行时间是线程刚刚开始执行的时间java程序占用cpu过高,tomcat基于http,只要我们找到了所请求的URL,就知道了该函数,因此我查看了tomcat日志并找到了当时正在运行的函数,并找到了两个实时查询性能和流量的方法. 检查两个功能的代码,发现两个功能应该没有问题. 程序中没有多线程操作或无限循环. 我该怎么办?
6. 不要放弃,找到杜娘
我在百度上搜索了sun.nio.ch.EPollArrayWrapper.epollWait,有些网页反映了同样的问题. 有很多比较. 最后,我发现这个问题是由早期版本的nio()中的一个错误引起的,令人怀疑,java官方网站说这个问题将在1.6.0_4中解决,但是很多网民反馈,并没有解决它,我们使用了_6版本,也发现了这个问题. 因此,这匹死马成了一名活马医生,并将JDK升级到了最新版本_45. 升级完成后,观察到几个小时后,CPU再次无法启动,并且未发现可疑的长期运行线程. 问题结束了. 简介: 上述问题和我们使用的环境在许多项目中很有用. 我们没有在其他项目中发现这样的问题. 只能在有限的硬件和软件条件下触发此问题. 希望您能在此过程中找到JAVA应用程序. 有关CPU使用率分析的一些想法.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-207045-1.html
默默祝福你
报告
我很想说其实三哥也是大国