【发布时间】: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 -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,设置环境变量,清理并重建,然后开始。这看起来确实更稳定,并且已经持续了大约 4 个小时。 CPU使用率已经攀升到90年代,然后似乎又开始自我清除了。
我已经完成了堆转储,然后通过 Eclipse 中的内存分析器运行它们(那里没有发现任何新内容),我使用 jconsole 和 jtop 来查看线程 - 没有任何东西跳出来,因此为什么我继续好奇它是否是java/jvm 问题。所以,我知道这是一篇很长的帖子——但我真的不知道从这里去哪里。有什么想法吗?
(我已经对此进行了详尽的网络搜索,并且一些文章指出可能是 Quartz 问题或 Hibernate 查询未刷新。自从我开始看到 CPU 问题以来,应用程序中没有任何变化,所以我不确定在哪里如果确实可以链接到任何一个,则开始进行故障排除。)
【问题讨论】: