web-dev-qa-db-ja.com

jvmヒープサイズを選択する方法は?

Jvmヒープサイズに関して私が通常行うことは、悪名高いOutOfMemoryExceptionを回避するために最大値を非常に高く設定することです。

ただし、この戦略(または戦略の欠如)はあまり賢くないようです。 :-)。

私の質問は、最小値と最大値、および2つの違い(max-minを小さくするか大きくするか)を選択する方法です。たとえば、 ここ から:

初期ヒープが小さすぎると、ヒープがより適切なサイズに成長するまでJVMがガベージコレクションを頻繁に実行するため、Javaアプリケーションの起動が遅くなります。最適な起動パフォーマンスを得るには、初期ヒープサイズを最大ヒープサイズと同じに設定します。

ありがとう。

25
LB40

私の質問は、最小値と最大値を選択する方法と、2つの違い(max-minを小さくするか大きくするか)です。

簡単な答え:推測しないで、アプリケーションのプロファイルを作成してください。

jconsoleは有用な高レベルのデータを提供できます メインの常駐セットの感覚と、通常割り当ててガベージコレクションする一時的なデータなど。そのディスプレイのメモリタブを見るとわかるのは、通常、のこぎり歯のようなものです。鋸歯の下隅は、通常、ヒープの最小値を設定する場所ですが、鋸歯のピークまたは勾配を使用して、ヒープの最大値を実験します。歯が非常に急な場合は、ガベージコレクションを遅らせるためだけに大きなヒープを検討することをお勧めします。ただし、そうでない場合は、ヒープの最大値を小さくして、マシン上の他のプロセスに多くのリソースが残る可能性があるかどうかを確認できます(たとえば)。

サーバーVM も考慮する必要があります。これにより、ガベージコレクションの動作が異なります。

とはいえ、 jvisualvmを使用してプロセスのメモリ使用量をプロファイルする などのより詳細なツールも使用する必要があります。調整または排除できるメモリリークまたは貪欲なアロケータがある可能性があります。それはあなたのヒープの必要性を完全に変えるでしょう。

21
Bob Cross

GCロギングを有効にして、OOMが発生している場所を確認する必要があります。

-verbose:gc
-Xloggc:gc.log  
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails

パーマスペースの制限が発生している可能性があります。-XX:MaxPermSize=YYYmで調整してください

とにかくあなたの質問に答えるために、私は最小値なしで始めて、最大値を比較的高く設定します。次に、gcログをグラフ化して、定常状態がどこにあるかを調べます。さまざまな世代の平均以上のサイズを視覚的に選択します。財務チャートのように読んでください。新しい世代での良好な広がりと、終身世代での一貫した成長と収集が必要になります。前述のように、パーマスペースをグラフ化して、絶えず増加していないことを確認します。

GCチューニングは芸術であり、決して科学ではありません。

5
Jé Queue

確かに、巨大な最大値を盲目的に設定することは実際には良い考えではなく(測定、推測しないでください)、この戦略は非常に長い「世界を止める」主要なGCにつながり、ユーザーエクスペリエンスの観点からは望ましくない可能性があります( 「ヒープが大きいほど、メジャーGCが長くなる」ことを常に念頭に置いてください。

とはいえ、あなたの質問に対する一般的な答えはありません。アプリケーションごとに異なるニーズがあります。実際には、yourアプリケーションのプロファイルを作成し、ヒープを調整して、(メジャー)GC頻度と(メジャー)GC期間の間の適切な妥協点を見つけることをお勧めします。エンドユーザーへの応答時間を最小限に抑えます。詳細については、Kirk Pepperdineのこのすばらしい ブログ投稿 (およびその他すべて)を読むことを強くお勧めします。

最小値と最大値の部分に答えるために、私は常に同じ値を使用します(より良い起動パフォーマンスとより良い再現性のために)。

3
Pascal Thivent

正解は次のとおりです。正解はありません各プロジェクトは異なり、プロジェクトごとにヒープサイズ構成を微調整する必要があります。私は小さく始めて、アプリケーションが意図したとおりに実行されるまでヒープサイズを徐々に増やしていきます。

あなたは正しいです、巨大な最大値を設定することは良い考えではありません。

2
Robert Greiner

OOMEが発生している場合は、実際には最大メモリをできるだけ増やすことから始め、それで問題が解決するかどうかを確認します。まず、マシンにパフォーマンスの問題を吸収させます。問題が解決しない場合は、パフォーマンス診断を調べてボトルネックを特定し、アプリがリークしている可能性がある領域や、ほとんどのメモリを占有している可能性がある領域で作業できます。

Jeff Atwoodが、この態度を説明するCodingHorrorに関する素晴らしい記事を掲載しています。パフォーマンスの問題に対する最も費用効果の高い解決策は、トラブルシューティングに開発者の時間を費やす前に、問題にハードウェア(またはこの場合はメモリリソースの増加)を投入することです。

http://www.codinghorror.com/blog/archives/001198.html

2
RMorrisey

通常、同じボックスで実行されている他のアプリケーションやプロセスがあるため、「-Xmsパラメーターを無視する」ことは非常に悪い考えです。アプリケーションを最大量のRAM割り当てられた状態で起動する必要があるため、失敗した場合は、別のアプリケーションが午前4時ではなく、起動ログを監視しているときに失敗します。ボックスで追加のRAMを使用しており、JVMのサイズを大きくすることはできません。

つまり、常にJVMの最小値と混合サイズを同じ値に設定します。

1
John