我有一个在Tomcat上运行的java应用程序(在Windows上作为服务运行),java进程在最终要求我重新启动Tomcat服务之前继续占用CPU。
首先我的设置: Windows 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 -version
与javac -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,设置了env变量,清理并重建并启动了。这似乎更稳定,已经持续了大约4个小时。 CPU使用率已经攀升至90年代,然后它似乎再次显现出来。
我已经完成了dumpdumps然后通过Eclipse中的Memory Analyzer运行它们(在那里没有找到新的东西),我使用了带有jtop的jconsole来查看线程 - 没有跳出来,所以为什么我继续好奇如果它是一个java / jvm问题。所以,我知道这是一个很长的帖子 - 但我真的不知道从哪里开始。有什么想法吗?
(我已经对此进行了详尽的网络搜索,有些文章指出可能是Quartz问题或者Hibernate查询没有刷新。自从我开始看到CPU问题以来,应用程序中没有任何变化,所以我不确定在哪里如果它确实可以链接到任何一个,则开始进行故障排除。)
答案 0 :(得分:2)
这不是一个容易的问题。你正在做所有的基础知识,看看它是否跳出来。这听起来像是一个缓慢的泄漏,随着时间的推移积累到无法操作的地步。这听起来像GC正在颠簸,应用程序没有响应。它也可能是在CPU上吃掉的失控的后台工作而且没有完成,这可能解释了长时间的延迟。您可以尝试关闭任何石英,看它是否会持续更长时间,这可能有助于引导您朝某个方向前进,或者将其调高以便更快地显示出来。
我知道你已经做了一些jconsole观看,但我认为你需要重新审视并观察你的内存使用情况,线程运行时间,你花在GC上的时间,以及观察内存的哪些部分正在被吃掉up(是Eden,Tenure已经不多了吗?)。
我确保您正在为在Quartz中运行的后台作业写出开始和结束消息。然后,您可以在问题开始时关联它们的开始和结束时间。还会告诉你你的工作是否完成。
现在可能是时候把它放到一个分析器(而不是jconsole)中,这样你就可以看到代码在哪里花费时间或者什么在炸毁内存。一个真实的分析器将让您看到所有数据混淆在您的代码和类上。我的最爱是JProfiler,但YourKit也很好。您可以获得7到30天的试用期,这样您就可以有足够的时间来描述并找出问题所在而无需购买。
一大早就开始这样,所以你希望在清晨看到一些东西。