2009-06-14 40 views
3

我有一個相當計算密集的Java基準程序,我正在Linux服務器上測試。它在我的Macbook上運行得很好。Java:內存限制隱藏在某處?

如果我在服務器上運行它,會發生以下情況:一旦內存佔用空間達到大約324 MB,程序就開始磨死。顯然,有些限制禁止使用更多的內存,垃圾收集器必須做更多的工作才能保持低於此限制。在某些時候,一個「GC開銷超過了」異常」被拋出。

我開始用java -Xmx16000m,以至於不能是內存限制。什麼是其他可能的限制?

這是Java版本我我使用:

的Macbook:

Java版本 「1.5.0_16」

的Java(TM)2運行環境,標準版(建立1.5.0_16-b06-284)

的HotSpot的Java(TM)客戶端虛擬機(建設1.5.0_16-133,混合模式,共享)

Linux服務器:

Java版本 「1.6.0_12」

的Java(TM)SE運行環境(建立1.6.0_12-B04)

的HotSpot的Java(TM)64位服務器VM(建11.2-B01,混合模式)

回答

2

使用JConsoleJVisualVM在運行時附加到JVM。藉助這些工具,您可以監視JVM中不同內存池的內存使用情況。 JVisualVM還允許您在CPU或內存的基礎上分析您的應用程序。這可能會讓你更好地理解你的應用程序爲什麼不按照它的方式行事。

1

感謝您的提示。雖然我的問題似乎更具體。 Java程序本身沒有任何問題。我從Mathematica的JLink調用Java。我現在意識到,324 MB的限制必須來自那裏(某處)。

+0

你怎麼指定-Xmx選項? JLink有點不直觀;有很多方法讓它默默地忽略你關於JVM的指令...... – 2011-07-17 00:24:17

-1

如果這是機器上可用的主存儲器。如果你的空閒內存不足,無論你有多少虛擬內存,你的程序都會停下來。

3

如果在垃圾收集中花費了太多時間,並行收集器將拋出一個OutOfMemoryError:如果超過總時間的98%用於垃圾收集,並且小於2%的堆被恢復,則OutOfMemoryError將被拋出。

此功能旨在防止應用程序長時間運行,而由於堆太小,進行很少或沒有進度。如有必要,可以通過在命令行中添加選項-XX: - 使用GCOverheadLimit來禁用此功能。