9

大規模な実験の一環として、クラスターでNetLogo (Java シミュレーション フレームワーク) シミュレーションを実行しようとしています。(比較的) 単純なシミュレーションに大量のメモリが必要と思われることに驚きました。クラスターでは、「-Xmx2500M」未満のヒープサイズに対して「java.lang.OutOfMemoryError: Java heap space」例外がスローされます。1 回の実行には 5 時間かかります。両方の Mac (iMac と MacBook Pro) で同じ実験を実行しましたが、1 時間もかからずに実行され、「-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 を要求しても、サーバー JVM が提供されます。

于 2013-09-19T12:55:08.653 に答える