我正在尝试在群集上运行NetLogo(java仿真框架)模拟,作为大型实验的一部分。我对(相对)简单模拟的看似庞大的内存要求感到惊讶。在集群上,它会为小于“-Xmx2500M”的任何内容抛出“java.lang.OutOfMemoryError:Java堆空间”异常。单次执行需要5个小时才能运行。我在我的Mac(iMac和MacBook Pro)上运行了相同的实验,并且他们在不到一个小时内执行,“-Xmx1024”没有出错。群集作业需要“-XX:MaxPermSize = 250M”,而在我的Mac上,不需要增加高于默认值。我运行相同的代码,相同的输入,在所有情况下使用完全相同的jar。
每种情况下使用64位JVM(据我所知,这些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)
我在所有情况下都运行Client JVM(最初在集群上使用Server,切换到客户端没有任何区别)。我尝试使用java 7在集群上执行,同样巨大的内存和执行时间问题。
我完全感到困惑,我所说过的任何人都无法解释这一点。以前有人遇到过这个吗?任何帮助非常感谢!
答案 0 :(得分:3)
我怀疑网络或磁盘IO速度更快。如果您使用队列写入磁盘或写入网络,其中一台计算机可以跟上而另一台计算机无法跟上,则队列可能会使计算机速度变慢并使用无限量的内存。
如果您有更快的网络IO,它可以帮助更快地发送数据(保持较小的队列),或者它可能意味着您收到的数据太快(意味着队列的增长速度超过了它们的消耗)
很大程度上取决于您的应用程序实际执行的操作。当你的程序获得OOME时,我建议你进行堆转储并对其进行分析,并查找占用大量内存的集合(例如队列)。
答案 1 :(得分:0)
我怀疑问题在于您使用的是服务器JVM。客户端JVM在64位计算机上不可用。即使您要求客户端JVM,它也会为您提供服务器JVM。