【问题标题】:Troubleshooting Java process with very high CPU usage - Tomcat application对 CPU 使用率非常高的 Java 进程进行故障排除 - Tomcat 应用程序
【发布时间】:2011-08-12 02:04:31
【问题描述】:

我有一个在 Tomcat 上运行的 java 应用程序(在 Windows 上作为服务运行),该 java 进程在最终需要我重新启动 Tomcat 服务之前继续占用 CPU。

首先我的设置: 视窗 2003 服务器 Tomcat 6,使用 Wrapper 作为服务运行 JDK:1.6.0_20

直到昨天,我一直在这里和那里看到捕获问题。我昨天中午不得不重新启动,然后在今天早上 2:30,然后今天我几乎无法重新启动应用程序并打开 jconsole 来监控它,然后它再次达到 99% 的 CPU 使用率。通过一系列我不太确定的事情,似乎我让 JVM 自行循环,并且应用程序在 10-30% 的 CPU 使用率范围内徘徊了几个小时。然而,随后它又开始爬升,最终进入了 99% 的 CPU 使用率细分。我也遇到了内存使用率高的问题,但是自从我所谓的让 JVM “循环”以来,这一直保持相当正常和稳定(也许是不好的术语,但这确实是它似乎在做的事情 - 并且在包装器日志中有一个它正在重新加载的所有类的转储)。

然后我又挖掘了一些,发现服务器上安装了 JRE 6 Update 24(我没有安装它,因为我对每个 java 更新都进行了彻底的测试 - 但也许我的服务器管理员做了更新)。我尝试过,但无法卸载它。因此,当我执行 java -versionjavac -version 时,我会得到不同的版本

java -version
    java version "1.6.0_24"
    Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
    Java HotSpot(TM) Client VM (build 19.1-b02, mixed mode, sharing)

javac -version
    javac 1.6.0_20

这种差异会导致各种 JVM 冲突吗? JAVA_HOME 和我的 PATH 变量都指向正确的 JDK 安装。

希望获得更高的稳定性,我决定将我的应用程序更改为在仍然安装的以前的 JDK 上运行 - JDK 1.6.0_04。我更改了 wrapper.conf,设置环境变量,清理并重建,然后开始。这看起来确实更稳定,并且已经持续了大约 4 个小时。 CPU使用率已经攀升到90年代,然后似乎又开始自我清除了。

我已经完成了堆转储,然后通过 Eclipse 中的内存分析器运行它们(那里没有发现任何新内容),我使用 jconsole 和 jtop 来查看线程 - 没有任何东西跳出来,因此为什么我继续好奇它是否是java/jvm 问题。所以,我知道这是一篇很长的帖子——但我真的不知道从这里去哪里。有什么想法吗?

(我已经对此进行了详尽的网络搜索,并且一些文章指出可能是 Quartz 问题或 Hibernate 查询未刷新。自从我开始看到 CPU 问题以来,应用程序中没有任何变化,所以我不确定在哪里如果确实可以链接到任何一个,则开始进行故障排除。)

【问题讨论】:

    标签: java jvm tomcat6


    【解决方案1】:

    这不是一个简单的问题。你正在做所有的基础工作,看看是否有什么东西跳出来。听起来好像存在缓慢的泄漏,随着时间的推移逐渐累积到无法运行的程度。这听起来像 GC 正在颠簸,应用程序没有响应。它也可能是失控的后台作业占用 CPU 并且没有完成,这可能解释了长时间的延迟。您可以尝试关闭任何石英,看看它是否能保持更长时间,这可能有助于引导您朝某个方向前进,或者将其调高以便它更快出现。

    我知道您已经进行了一些 jconsole 观察,但我认为您需要重新访问并观察您的内存使用情况、线程运行时间、您在 GC 中花费了多少时间,以及查看哪些内存部分被占用up(是不是 Eden,Tenure 快用完了?)。

    我会确保您正在为在 Quartz 中运行的后台作业编写开始和结束消息。然后,您可以将它们的开始时间和结束时间与此问题开始的时间关联起来。还会告诉您您的工作是否完成。

    现在可能是时候将它放入分析器(而不是 jconsole)中,这样您就可以看到它在代码中的哪些地方花费了时间,或者是什么在消耗内存。一个真正的分析器将让您看到所有数据混搭在您的代码和类上。我最喜欢的是 JProfiler,但 YourKit 也不错。您可以获得 7-30 天的试用期,这样您就有足够的时间来分析和解决您的问题,而无需购买。

    从一大早开始,希望你能在凌晨看到一些东西。

    【讨论】:

    • 感谢您的回复。我发现了一个应用程序代码问题,我认为这是有贡献的。自从这次保存后不久它就一直很稳定,所以我希望最好,尽管我仍在分析它并试图找到任何其他可能的代码问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    相关资源
    最近更新 更多