Java:内存限制藏在哪里?

3
我有一个在Java中相当计算密集的基准程序,我正在Linux服务器上测试它。在我的Macbook上运行得非常好。如果我在服务器上运行它,以下情况发生:一旦内存占用量达到约324 MB,程序就开始变得非常缓慢。显然,某些限制阻止其使用更多内存,并且垃圾收集器必须做越来越多的工作以保持低于此限制。在某个时候,会抛出“GC overhead exceeded”异常。我使用-Xmx16000m启动java,因此不能是内存限制。还有其他可能的限制吗?这些是我使用的Java版本:Macbook:java version "1.5.0_16" Java(TM) 2 Runtime Environment,Standard Edition(build 1.5.0_16-b06-284)Java HotSpot(TM) Client VM(build 1.5.0_16-133,mixed mode,sharing)Linux Server:java version "1.6.0_12" Java(TM) SE Runtime Environment(build 1.6.0_12-b04)Java HotSpot(TM) 64-Bit Server VM(build 11.2-b01,mixed mode)
4个回答

3

如果垃圾回收占用的时间过长,即总时间的98%以上都用于垃圾回收且堆恢复不到2%,并行收集器将抛出OutOfMemoryError。

这个特性旨在防止应用程序因堆太小而无法取得任何进展而长时间运行。如有必要,可以通过在命令行中添加选项-XX:-UseGCOverheadLimit来禁用此功能。


2
使用 JConsoleJVisualVM 工具可以在运行时连接到您的JVM。使用这些工具,您可以监控JVM内不同内存池的内存使用情况。 JVisualVM还允许您基于CPU或内存对应用程序进行性能分析,这可能会帮助您更好地理解应用程序的不正常行为原因。

1

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


你是如何指定 -Xmx 选项的?JLink有点不直观;它有很多方式可以悄悄地忽略你对JVM的指示... - Scott Morrison

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接