2013-10-07 145 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