2012-09-10 22 views
8

大規模な実験の一環として、クラスタ上でNetLogo(Javaシミュレーションフレームワーク)シミュレーションを実行しようとしています。私は、(比較的)シンプルなシミュレーションの大量のメモリ要求に驚いていました。クラスタ上では、 "-Xmx2500M"がheapsizeよりも小さいものについては、 "java.lang.OutOfMemoryError:Java heap space"例外がスローされます。 1回の実行には5時間かかります。 Mac(iMacとMacBook Pro)の両方で同じテストを実行したところ、1時間以内に実行され、「-Xmx1024」はエラーが発生しませんでした。クラスタジョブでは「-XX:MaxPermSize = 250M」が必要ですが、Macではデフォルトを上回らないようにしてください。同じコードを入力しましたが、すべてのケースで同じジャーを使いました。同じプログラム、同じJVMですが、異なるマシン上でのメモリ要件と実行時間が大きく異なります - なぜですか?

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、同じ巨大なメモリと実行時間の問題で、クラスタ上で実行しようとしました。

私は完全に困惑しています。私はこれを説明することはできません。誰もそこに出てきたのですか?どのような助けが大いに感謝!

+0

おそらく、-XX:+ HeapDumpOnOutOfMemoryErrorでヒープダンプを作成し、次にMATなどを使用してメモリを使い果たしているかどうかを確認する必要があります。 –

+0

私はVisualVMやYourKitのような商用メモリプロファイラを使用します。 –

+0

は2つの異なるjvmバージョンを持っているように私に見えます。あなたの問題だと言っているわけではありませんが、それは貢献する可能性があります。 – Matt

答えて

3

ネットワークまたはディスクのIOが高速であると思われます。キューを使用してディスクに書き込んだり、1台のコンピュータが追いつくことができないネットワークに書き込んだりすることができない場合、キューはマシンの速度を落とし、無制限のメモリを使用するようになります。

あなたはより高速なネットワークIOを持っている場合、それはどちらかの缶(小さなキューを維持する)より高速なデータを送る手助け、またはそれはあなたが多くの依存

(キューは、彼らが消費されるよりも速く成長することができますを意味します)あまりにも速くデータを受信意味することができますあなたのアプリケーションが実際に何をしているかについて。あなたのプログラムがOOMEを取得したら、ヒープダンプを取得して解析し、たくさんのメモリを消費するコレクション(キューなど)を探すことをお勧めします。

+0

非常に速い答えに感謝します。 IO速度は最初の提案の1つでした。クラスターははるかに遅く、私自身のマシンよりはるかに遅い初期化について説明します。しかし、いったん実行しているプログラムは、最後まで(5時間後)はディスクへの読み書きは行わず、実行すると1つのファイルに1行を書き込みます。また、これらのテスト中にクラスタ上に何も実行していない人もいます。私はヒープダンプを調べますが、その間に他の提案はありますか? – user1660640

+0

クラスタをシミュレートする場合は、ループバックでもネットワークIOがありますか?速度データはループバックで転送することができ、プロセッサとOSによって大幅に変化します。 –

+0

ジョブ全体(1つのジョブ)が1つのクラスタノードで実行されます。アイデアは、一度に数百のジョブを実行することです。必要なノード間に通信はなく、各ジョブは完全に自己のJavaプロセスとして組み込まれています。 – user1660640

0

問題がサーバーJVMを使用していると思われます。クライアントJVMは、64ビットマシンでは使用できません。クライアントJVMを求める場合でも、サーバーJVMを提供します。