2012-06-20 4 views
8

私は5つの異なるタスクを実行するJavaプログラムを持っています。 -Xmx512mメモリパラメータでプログラムを実行すると、タスク1〜4は正常に動作しますが、タスク5はメモリ不足になります。 -Xmx1024mでプログラムを実行すると、5つのタスクはすべて正常に動作しますが、以前は512mのヒープで正常に動作していたタスク1〜4はほとんどすべて1024mのヒープを使い果たします。 -Xms128m -Xmx1024mを使用しても同じことが起こります。JVMがメモリフットプリントをできるだけ低く保つように指示する方法は?

JVMがメモリ使用率を低く抑えるように(たとえばタスク1-4では512m)、実際に必要なときだけ(たとえばタスク5の場合)より多くのメモリを使用するように指示するメモリパラメータは何ですか?

ガベージコレクタをデフォルト設定より頻繁にアクティブにする方法が必要なのでしょうか?

+0

どのタスクでどの程度の量のメモリを使用するかを区別していますか? – Poindexter

+0

1から4までのタスクの使用量はどのくらい重要ですか?とにかく、あなたは既にプログラム全体に対して1ギガバイトを割り振っています。 –

+0

@Poindexterコマンドラインパラメータを渡して、実行するタスクを指定します。それから私は 'prstat'を使ってプログラムのメモリ利用率を見ます。 – Raihan

答えて

5

JVMの仕組みについて誤解があると思います。これはGCの問題でも「タスク」の問題でもありません。

タスクにはメモリリークがあるか、より多くのメモリを保持するように設計されています。

-Xmx1024mは、JVMが割り当てることができる最大メモリを設定します。 1024メガの物理メモリーと仮想メモリーしか持たない場合と同じことになります。

タスクの定義で質問を更新すると便利です。これら5つの別々のJVMはありますか?または、単一のJVMでわずか5単位の作業。

更新

私は常にすべての1グラムのヒープを使用するプログラムを意図していません。私の目的は、JVMが512mヒープを使用するように指示することです。必要な場合にのみ、より多くのメモリを管理し、使用することができます。メモリがもはや必要でないときは、512mまたはさらに少ないメモリ量に戻す。

-Xmx1024mを設定しても、JVMがすべてのメモリを使用するわけではありません。これは単なる上限です。使用するメモリの最小量を設定するまでXmsを設定します。あなたのプログラムは最終的に利用されているメモリの実行量を決定します。 -Xmxで設定された制限に達すると、OutOfMemoryErrorがスローされます。

System.gc()を呼び出すことによって、ガベージコレクタを実行するようにJVMに提案できます。私が示唆したことは、あなたはGCを実行させることができないということです。 GCを実行することを拒否するプラットフォームで実行している可能性があります。また、アプリケーションにどのようなGCアルゴリズムが選択されているかを調べる必要があります。私はここに見えるだろうTuning Garbage Collector

メモリ使用量の上にこのような細粒度のコントロールが必要な場合は、JVM以外のものを選択する必要があります。

+0

私はプログラムを実行するときに、プログラムが実行する5つのタスクのどれを示すかを示すコマンドラインパラメータを渡します。プログラムの存続期間中、要求されたタスクを実行している間、私はプログラムのメモリー使用率をモニターします。タスク1-4の場合、-Xmx512mを使用すると、完了前にメモリの使用率が約512mに上昇することがわかります。 -Xmx1024mを使用すると、メモリ使用率は約512mしか使用できない場合、完了前に約1024mに上昇します。 – Raihan

+0

@Raihan私はこれについて考えることができる2つのことがあります。スワップされていないメモリがあります。また、メモリを増やすとGCが積極的に実行されないため、メモリ使用量よりもパフォーマンスが重視されます。メモリが使い果たされていることがわかった場合、多くの不自然な参照を解放しようとします。十分な記憶力があれば、ちょっとだけそれらを残すことができます。 –

+0

@Raihan JVMを固執する必要がある場合は、すべての場合に実行する必要がある最大量のメモリを探します。 System.gc()を使用してGCにシステムを提案します。 -Xmx1024mの場合、System.gc()を呼び出して、使用量が多いかどうかを確認します。また、正しいメモリ値を読むことに注意してください。 JVMがすべてのメモリを解放したからといって、OSがすべてのメモリをプロセスから離れさせようとしているわけではありません。 –

1

VMに-Xmx1024mを渡すことで、基本的にVMに最大1ギガヘルプのギガバイトを使用できることが伝えられます。これは最終的に実行されます。 VMはガベージコレクションが必要になったときに実行を開始します。ヒープが使い尽くされると、使用可能なヒープサイズに依存します。 外部から実行するタスクがわかっている場合(cmd行パラメータとして渡すために行うと思います)、-Xmxを外部からも設定しないのはなぜですか?

+0

ガベージコレクタに、起動前に-Xmxの量のヒープがすべて使い果たされ、新しい 'X 'メモリが割り当てられるたびに起動するまで待たないようにする方法はありますか? – Raihan

+0

http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.htmlで遊ぶことができるフラグがたくさんあります。それらの影響のいくつかについてはあまりよく分かりませんフラグがあります。 – jayeff

8

それはそのヒープサイズを調整する必要があるとき、これらの2つのパラメータは、JVMをお勧め:

-XX:MaxHeapFreeRatio=10 
-XX:MinHeapFreeRatio=10 

することはほとんどGC後、ヒープの10%以上がフリーであれば、それは与えることをしようとすることを意味していますメモリはOSに戻されます。ヒープの90%以上がgcの後に使用される場合にのみ、ヒープを拡張します。

これは、gcが割り当てられたメモリサイズを常に変更するため、プログラムが遅くなる可能性があります。あなたのプログラムが短期間に大量のメモリを割り当てても効果が全くない可能性があります。

関連する問題