9

次のようなJavaメモリ構成が与えられた場合

 -Xmx2048m -Xms512m

メモリ使用量が 512m を超えた場合、VM の動作はどうなりますか? それが従う特定のアルゴリズムはありますか?すなわち。それは最大までまっすぐに進みますか、2 倍になりますか、増分しますか、それともメモリが必要なときにのみ割り当てますか? 手術費用はどのくらいかかりますか?

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

4

3 に答える 3

6

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

最新のプラットフォームでの典型的な値は 40 程度です。したがって、512 MB から開始して空き容量が 40% 未満の場合、つまり 308 MB を超えた場合、空き容量が 40% になるまで増加します。コレクションの後、まだ 400MB 相当のライブ オブジェクトがあるとすると、ヒープは最大 667MB になります。(はい、比率という名前ですが、引数として % 値が必要です...検索してください!)

これは少し不正確であることに注意してください。ガベージコレクターは「世代別」であり、実際には個々の世代のサイズを変更できますが、世代のサイズ間の比率も強制されており、オブジェクトが推定どおりに長寿命と短寿命の間で分散されている場合、封筒の裏にはかなりうまくいきます。

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

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

于 2013-02-19T23:33:00.933 に答える
2

-verbose:gcand/orオプションを使用すると、-XX:+PrintGCDetailsより詳細な情報が得られるはずです。

-verbose:gcオプションをオンにした場合の出力例を次に示します。

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

公式文書から取られた上記の説明:

ここでは、2 つのマイナー コレクションと 1 つのメジャー コレクションが続きます。矢印の前後 (たとえば、325407K->83000K最初の行から) の数字は、それぞれガベージ コレクション前後のライブ オブジェクトの合計サイズを示します。マイナー コレクションの後、サイズにはガベージ (もはや生きていない) であるが再利用できないいくつかのオブジェクトが含まれます。これらのオブジェクトは、Tenured 世代に含まれているか、Tenured 世代または Permanent 世代から参照されます。

括弧内の次の数字 (たとえば、776768K最初の行の ( ) など) は、コミットされたヒープ サイズです。つまり、オペレーティング システムから追加のメモリを要求することなく、Java オブジェクトに使用できる領域の量です。任意の時点で使用できるのは 1 つだけであるため、この数には Survivor スペースの 1 つが含まれていないことに注意してください。また、仮想マシンによって使用されるメタデータを保持する永続的な世代も含まれていません。

行の最後の項目 (例: 0.2300771 secs) は、収集の実行にかかった時間を示します。この場合、約 4 分の 1 秒です。

3 行目のメジャー コレクションの形式も同様です。

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

于 2013-02-19T23:40:55.473 に答える
0

JVM on Initialization は仮想的に最大のアドレス空間を予約しますが、物理メモリを割り当てないことに注意してください。通常、JVM はスペースを Old 世代と Young 世代に割り当てます。ヤングジェネレーションには中間スペースがあります。呼び出された新しいオブジェクトは、若い世代に含まれています。

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

Survivor スペースがいっぱいになると、JVM はフル GC を呼び出します。

于 2013-02-20T00:31:45.480 に答える