9

作为大型实验的一部分,我正在尝试在集群上运行NetLogo (Java 模拟框架)模拟。我对(相对)简单的模拟看似庞大的内存需求感到惊讶。在集群上,对于小于“-Xmx2500M”堆大小的任何内容,它都会引发“java.lang.OutOfMemoryError: Java heap space”异常。一次执行需要 5 小时才能运行。我在我的两台 Mac(iMac 和 MacBook Pro)上进行了相同的实验,它们在不到一小时的时间内执行,“-Xmx1024”没有出现错误。集群作业需要“-XX:MaxPermSize=250M”,而在我的 Mac 上,不需要高于默认值。在所有情况下,我使用完全相同的 jar 运行相同的代码、相同的输入。

在每种情况下都使用 64 位 JVM(据我所知,它们非常相似):

<on the cluster>
$ java -version
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)

<on my macs>
$ java -version
java version "1.6.0_31"
Java(TM) SE Runtime Environment (build 1.6.0_31-b04-415-10M3646)
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01-415, mixed mode)

而且我在所有情况下都在运行客户端 JVM(最初是在集群上使用服务器,切换到客户端没有任何区别)。我曾尝试使用 java 7 在集群上执行,同样巨大的内存和执行时间问题。

我完全感到困惑,与我交谈过的人都无法解释这一点。有没有人以前遇到过这个?非常感谢任何帮助!

4

2 回答 2

3

我怀疑一个有更快的网络或磁盘 IO。如果您使用队列写入磁盘或写入网络,其中一台计算机可以跟上而另一台计算机不能跟上,则队列可能会增长,从而减慢机器速度并使用无限量的内存。

如果您有更快的网络 IO,它可以帮助更快地发送数据(保持队列较小),或者这可能意味着您接收数据的速度太快(这意味着队列的增长速度可能快于消耗的速度)

很大程度上取决于您的应用程序实际执行的操作。当您的程序发生 OOME 时,我建议您获取堆转储并对其进行分析并查找消耗大量内存的集合(例如队列)。

于 2012-09-10T16:22:48.247 回答
0

我怀疑问题在于您使用的是服务器 JVM。客户端 JVM 在 64 位机器上不可用。即使您要求使用客户端 JVM,它也会为您提供服务器。

于 2013-09-19T12:55:08.653 回答