1

GCフラグを指定することで、OutOfMemory例外の解決策が考えられますか、それとも影響がないのでしょうか、それともプログラムがメモリ不足になるのでしょうか。

問題のGCフラグは次のとおりです。-XX:+UseConcMarkSweepGCおよび-XX:+CMSIncrementalMode

上記のフラグ(および一般にGCフラグ)はJVMのパフォーマンス(応答/速度に関連して)を調整するためにあると思ったので質問していますが、プログラムの最小メモリ要件の削減には影響しません。つまり、プログラムを最後まで実行するのに十分なメモリがない場合(たとえば、OutOfMemory例外が発生した場合)、JVMチューニングの量はそれを解決しません。

4

3 に答える 3

3

あなたが得るならばOutOfMemoryError: heap space、あなたがすることができることは何もありません。JVMは、ヒープから最後のバイトをGCする前にこれをスローすることはありません。

ただし、を取得した場合OutOfMemoryError: GC overhead limit exceeded、これは「ソフト」エラーであり、GCのオーバーヘッドを軽減する構成設定がある可能性があるため、それについてまだできることがある可能性があります。非常にありそうもないことですが、追加する必要がありますが、少なくとも理論的には可能です。

于 2012-10-22T19:23:29.273 に答える
1

コードにメモリリークがある場合、それらのフラグは役に立ちません。

仮想マシンのガベージコレクションのチューニングによると:

アプリケーションにかなり厳しい一時停止時間の要件がない限り、最初にアプリケーションを実行し、VMがコレクターを選択できるようにします。必要に応じて、ヒープサイズを調整してパフォーマンスを向上させます。それでもパフォーマンスが目標を達成できない場合は、コレクターを選択するための開始点として次のガイドラインを使用してください。

アプリケーションに小さなデータセット(最大約100MB)がある場合は、

  • でシリアルコレクターを選択します-XX:+UseSerialGC

アプリケーションが単一のプロセッサで実行され、一時停止時間の要件がない場合は、

  • VMにコレクターを選択させる、または
  • でシリアルコレクターを選択します-XX:+UseSerialGC

(a)アプリケーションのピークパフォーマンスが最優先事項であり、(b)一時停止時間の要件がないか、1秒以上の一時停止が許容される場合は、

  • VMにコレクターを選択させる、または
  • で並列コレクターを選択し-XX:+UseParallelGC、(オプションで)で並列圧縮を有効にし-XX:+UseParallelOldGCます。

応答時間が全体的なスループットよりも重要であり、ガベージコレクションの一時停止を約1秒より短くする必要がある場合は、

  • で並行コレクターを選択します-XX:+UseConcMarkSweepGC。1つまたは2つのプロセッサしか使用できない場合は、以下で説明するインクリメンタルモードの使用を検討してください。
于 2012-10-22T19:22:45.567 に答える
1

重要な唯一のチューニングパラメータは最大メモリです。つまり-Xmx、または-mx メモリリークが原因でプログラムのメモリが不足している場合は、これを上げても役に立ちません。

ところで:メモリチューニングを設定すると、実際には、使い切る前に使用できるメモリの量を減らすことができます。たとえば、NewSizeを設定すると、JVMがすべてのメモリを使用するために世代のサイズを変更できる量が制限される可能性があります。

一般に、すべてのメモリを使用する場合は、使用するオプションが少ないほど適切です。

于 2012-10-22T19:24:26.230 に答える