2013-10-07 191 views
0

我们有一个在Ubuntu Server 12.04和java上运行的应用程序。消耗100%CPU的JVM

Java的版本回报:

Java版本 “1.7.0_40”

的Java(TM)SE运行时环境(建立1.7.0_40-b43)中

的HotSpot的Java(TM) 64位服务器VM(建设24.0 - B56,混合模式

我们有相同的技术,但没有问题的其他应用程序。

服务器信息: RAM:2G 操作系统:Ubuntu服务器12.04 铌CPU:2

程序语言阶。

运行一段时间后,JVM似乎睡着了。一个CPU继续以100%旋转。

JVM选项:

-Xms1g -Xmx1g -XX:+ HeapDumpOnOutOfMemoryError -XX:+ UseParNewGC -XX:+ UseConcMarkSweepGC -XX:+ PrintGCDetails -XX:+ PrintGCTimeStamps -XX:+ PrintTenuringDistribution -XX: -DisableExplicitGC -XX:CMSFullGCsBeforeCompaction = 1 -XX:+ CMSClassUnloadingEnabled -XX:+ CMSIncrementalMode -XX:MaxGCPauseMillis = 1500 -XX:GCTimeRatio = 9 -XX:CMSInitiatingOccupancyFraction = 50 -XX:-UseGCOverheadLimit -XX:MaxHeapFreeRatio = 60

使用jstat -gcutil [PID],我已经看到FGC快速增长。

你对这个问题有想法吗?

感谢

+2

** 100%CPU使用率**对于重度GC活动**为99.9%符号** ...另外,2内核2G内存?似乎不符合标准...此外,请务必检查堆转储以查看堆中的内容,以便能够纠正这种情况 – ppeterka

+0

以及任何人都可以在此帮助您?没有可以指出问题的信息。 [应该阅读此。](http://stackoverflow.com/help/on-topic) –

+0

JIT comilation迷上了,或GC正在工作。没有什么不对,它不会持续很长时间。 –

回答

0

你有这个问题的想法?

它可以是任何数量的东西。但是(IMO)最可能的解释是,你的应用程序中有一个错误,表现为无限循环。

将调试器附加到JVM。或者如果你不能这样做,发送它必要的信号,使它产生一个线程转储到控制台输出流。然后分析转储以查看是否可以获得任何线索。

这不是那种问题,我们可以给你一个神奇的答案。根据您对应用程序的了解以及您在分析/调试方面的努力,您很可能需要为自己弄清楚。 (事实上​​,这是Scala意味着这也可能是Scala编译器或运行时的错误)。

+0

我已经分析了堆转储,并且我在java.util.concurrent.ThreadPoolExecutor下看到了更多的java.util.concurrent.LinkedBlockingQueue。 – Loic

+0

继续下去。接下来,你需要弄清楚为什么你的代码在那个时候正在旋转。 –

+0

是的,我知道但我找不到。 – Loic