9

5つの異なるタスクを実行するJavaプログラムがあります。-Xmx512mメモリパラメータを使用してプログラムを実行すると、タスク1〜4は正常に実行されますが、タスク5のメモリが不足します。-Xmx1024mを使用してプログラムを実行すると、5つのタスクすべてが正常に実行されますが、以前は512mヒープで正常に実行されていたタスク1〜4は、1024mヒープのほぼすべてを消費するようになりました。-Xms128m-Xmx1024mを使用しても同じことが起こります。

メモリ使用率を低く保ち(たとえば、タスク1〜4の場合は512m)、実際に必要な場合にのみ(たとえば、タスク5の場合)より多くのメモリを使用するようにJVMに指示するメモリパラメータは何でしょうか。

たぶん、デフォルト設定よりも頻繁にガベージコレクターをアクティブ化する方法が必要ですか?

4

4 に答える 4

10

これらの2つのパラメーターは、ヒープサイズを調整する必要がある場合にjvmを提案します。

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

これは、gcの後で、ヒープの10%以上が解放された場合、メモリをOSに戻そうとすることを意味します。gcの後にヒープの90%以上が使用された場合にのみ、ヒープが増加します。

gcは割り当てられたメモリサイズを絶えず変更するため、これによりプログラムの速度が低下する可能性があります。また、プログラムが短時間で大量のメモリを割り当てる場合は、まったく効果がない可能性があります。

于 2012-06-20T18:20:30.733 に答える
5

JVMがどのように機能するかについて誤解していると思います。これはGCの問題でも「タスク」の問題でもありません。

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

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

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

アップデート

プログラムが常にすべての1gヒープを使用するつもりはありません。私の意図は、管理できる場合は512mヒープを使用し、必要な場合にのみより多くのメモリを使用するようにJVMに指示することです。メモリが不要になったら、512m以下のメモリにフォールバックします。

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

を呼び出すことにより、JVMにガベージコレクタを実行するように提案できますSystem.gc()。私が提案したことに注意してください。GCを強制的に実行することはできません。GCを実行することさえ拒否するプラットフォームで実行している可能性があります。また、アプリケーションにどのGCアルゴリズムを選択しているかを調べる必要があります。ここでガベージコレクターのチューニングを確認します。

メモリ使用量をこのように細かく制御する必要がある場合は、JVM以外のものを選択する必要があります。

于 2012-06-20T15:51:28.073 に答える
1

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

于 2012-06-20T16:03:18.817 に答える
1

メモリ消費量を確認するには、 http: //visualvm.java.net/を使用してみてください。次に、jhatを使用してヒープコンテンツを視覚化し、http: //www.eclipse.org/mat/を使用してリークを識別します。

于 2012-06-20T16:10:24.377 に答える