Java:某处隐藏的内存限制?

时间:2009-06-14 12:41:07

标签: java

我在Java中有一个相当计算密集的基准程序,我正在Linux服务器上测试。它在我的Macbook上运行得很好。

如果我在服务器上运行它,会发生以下情况:一旦内存占用空间达到大约324 MB,程序就会开始停止运行。显然有些限制禁止它使用更多的内存,垃圾收集器必须做更多的工作来保持低于这个限制。在某些时候,抛出“GC开销超出”异常“。

我用-Xmx16000m启动java,因此不能是内存限制。还有其他可能的限制吗?

这些是我正在使用的Java版本:

的MacBook:

java版“1.5.0_16”

Java(TM)2运行时环境,标准版(版本1.5.0_16-b06-284)

Java HotSpot(TM)客户端VM(版本1.5.0_16-133,混合模式,共享)

Linux服务器:

java版“1.6.0_12”

Java(TM)SE运行时环境(版本1.6.0_12-b04)

Java HotSpot(TM)64位服务器VM(版本11.2-b01,混合模式)

4 个答案:

答案 0 :(得分:3)

如果在垃圾收集中花费了太多时间,则并行收集器将抛出OutOfMemoryError:如果超过98%的总时间花在垃圾收集上并且不到2%的堆被恢复,则OutOfMemoryError将是抛出。

此功能旨在防止应用程序长时间运行,同时由于堆太小而几乎没有进展。如有必要,可以通过在命令行中添加选项 -XX:-UseGCOverheadLimit 来禁用此功能。

答案 1 :(得分:2)

使用JConsoleJVisualVM在运行时附加到JVM。使用这些工具,您可以监视JVM中不同内存池的内存使用情况。 JVisualVM还允许您基于CPU或内存分析应用程序。这可能会让您更好地理解应用程序不按预期运行的原因。

答案 2 :(得分:1)

感谢您的提示。不过,我的问题似乎更具体。 Java程序本身没有任何问题。我从Mathematica的JLink调用Java。我现在意识到324 MB的限制必须来自那里(某处)。

答案 3 :(得分:-1)

如果这是机器上可用的主存储器。如果你的可用内存耗尽,无论你有多少虚拟内存,你的程序都会停止运行。