2013-02-19 13 views
9

は、VMのメモリ使用量が増加し、過去512メートルの行動がどうなるか、以下のJavaヒープの動作

-Xmx2048m -Xms512m 

のようなJavaのメモリ構成を考えると?それに続く特定のアルゴリズムはありますか?すなわち、それは最大にまっすぐ行くのですか、それは倍増ですか、それは増分で行くのですか、それともメモリが必要なだけに割り当てられますか?それはどれくらいの費用がかかりますか?

私は特にOracle/Sun JVMバージョン1.6を見ています。私はこれがどこかのOracleのWebサイトで文書化されていると仮定していますが、問題が見つかっています。

+0

これは間違いなく最大にまっすぐに行かない。 –

+0

最小+最大を定義しています。それは少なくとも512mbであるが、2048mbのキャップを持つ。 – adrian

+0

私の理解では、JVMの起動時に最小メモリ値が割り当てられます。起動時に、ホストオペレーティングシステムから512mを消費して、それ自身の使用に利用します。私が理解できないことは、それが512m以上必要なとき、どれくらいかかり、どのようにそれを取るのだろうか?例えば、 - JVMは750 MBを必要とする - それは正確に750 MBを消費するか、1024 MBに成長するか?あるいは、他の行動に従う? – Ren

答えて

6

リサイズが必要なときにガベージコレクタの仕事を決定するため、GCパラメータ 'MinFreeHeapRatio'によって決定されます。 GCにさらにスペースが必要な場合は、その値で指定されたヒープの%が使用可能なサイズに拡大されます。

現代的なプラットフォームの典型的な値は40インチです。したがって、512MBから始まり、40%未満の空きがある場合、〜308MBを超えた場合、40%が再び解放されるまで増加します。コレクション後にまだ400MB相当のライブオブジェクトがあるとしたら、ヒープは〜667MBになります。 (はい、比率と呼ばれますが、引数として%の値を期待しています...)私を検索してください。

これはちょっと正確ではありません。ガベージコレクタは世代別で、実際には世代を変更することができますが、あなたのオブジェクトが長期間と短期間の間に分散されている場合は、おおまかに推測された方法で生きています。

これは、Java 6のデフォルトに適用されます。カスタムガベージコレクタの設定を使用する場合、これは異なる場合があります。あなたはここでそれについて読むことができます:http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html#generation_sizing.total_heap

(操作の種類の「費用」はオペレーティングシステムに依存し、それ以外は何が起こっていますか?システムがロードされ、OSがスワッピングを行う必要がある場合あなたのためのメモリの連続ブロック、それは非常に高価になる可能性があります!)

+0

ちょうど私が必要なもの!ありがとう。 – Ren

2

-verbose:gcおよび/または-XX:+PrintGCDetailsオプションの使用は、より詳細な細部を与える必要があります。

[GC 325407K->83000K(776768K), 0.2300771 secs] 
[GC 325816K->83372K(776768K), 0.2454258 secs] 
[Full GC 267628K->83769K(776768K), 1.8479984 secs] 

公式documentから取られた上記の説明を:

ここでは、一つの大きな続く2つのマイナーコレクションを参照してくださいここで

-verbose:gcオプションを使用して例の出力はオンになっていますコレクション。 矢印の前後の数字(例: の最初の行の325407K->83000K)は、ガベージコレクション後のライブオブジェクトと の結合サイズをそれぞれ示します。小さなコレクションの後には、 のサイズには、ゴミ(生存していないもの)がいくつか含まれていますが、 は再利用できません。これらのオブジェクトは、テナント化された 世代に含まれているか、またはテナントまたは永続世代から参照されています。オペレーティング システムからより多くのメモリを要求することなく、Javaオブジェクト用 使用可能なスペースの量:

括弧内の次の番号(例えば、第一 ラインから再び(776768K))は、ヒープのコミットサイズです。この番号には生存者 のいずれかのスペースは含まれていないことに注意してください. には 仮想マシンで使用されるメタデータを保持する永続世代は含まれていません。

この行の最後の項目(たとえば、0.2300771 secs)は、収集を実行する時刻が であることを示します。この場合、約1秒の約四分の一が となります。

3行目のメジャーコレクションの形式は似ています。

この方法でアプリケーションを実行すると、最小ヒープサイズと最大ヒープサイズを更新すると、VMのヒープ割り当てとガベージコレクションパターンを把握できます。

0

JVM on Initializationは仮想アドレス空間を最大限確保しますが、物理メモリは割り当てないことに注意してください。通常、JVMはOld世代とYoung世代に領域を割り当てます。若い世代には中間空間があります。呼び出された新しいオブジェクトは、Young Generationに含まれています。

中間空間がいっぱいになると、参照オブジェクトを若年世代セグメントの生存空間と呼ばれる中間空間の1つに移動するGCが呼び出されます。 GCは、スレッドの状態アルゴリズムまたはアルゴリズムを保存してプロセスが実行し続けるようにする(「?」)ことにより、「世界を止める」ことができます。

サバイバーのスペースがいっぱいになると、JVMは完全なGCを呼び出します。

関連する問題