我在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,混合模式)
答案 0 :(得分:3)
如果在垃圾收集中花费了太多时间,则并行收集器将抛出OutOfMemoryError:如果超过98%的总时间花在垃圾收集上并且不到2%的堆被恢复,则OutOfMemoryError将是抛出。
此功能旨在防止应用程序长时间运行,同时由于堆太小而几乎没有进展。如有必要,可以通过在命令行中添加选项 -XX:-UseGCOverheadLimit 来禁用此功能。
答案 1 :(得分:2)
使用JConsole或JVisualVM在运行时附加到JVM。使用这些工具,您可以监视JVM中不同内存池的内存使用情况。 JVisualVM还允许您基于CPU或内存分析应用程序。这可能会让您更好地理解应用程序不按预期运行的原因。
答案 2 :(得分:1)
感谢您的提示。不过,我的问题似乎更具体。 Java程序本身没有任何问题。我从Mathematica的JLink调用Java。我现在意识到324 MB的限制必须来自那里(某处)。
答案 3 :(得分:-1)
如果这是机器上可用的主存储器。如果你的可用内存耗尽,无论你有多少虚拟内存,你的程序都会停止运行。