Cosminexus システム設計ガイド

[目次][用語][索引][前へ][次へ]

8.3.2 DefNew領域のメモリサイズを追加する理由

Tenured領域のメモリサイズには,アプリケーションが最低限必要とするメモリサイズに,DefNew領域分のメモリサイズを追加することをお勧めします。これは,Tenured領域の未使用メモリサイズがDefNew領域の使用メモリサイズを下回ることによって,フルガーベージコレクションが頻発するのを防ぐためです。

通常,DefNew::Eden領域がいっぱいになると,コピーガーベージコレクションが発生します。このとき,DefNew::Eden領域とDefNew::Survivor領域のFrom空間に存在する使用中のJavaオブジェクトが,DefNew::Survivor領域のTo空間に移動しようとします。しかし,使用中のJavaオブジェクトのメモリサイズがTo空間のメモリサイズよりも大きい場合,使用中のJavaオブジェクトはTo空間ではなく,Tenured空間に退避されます。このとき,Tenured空間の未使用領域がDefNew::Eden領域とDefNew::Survivor領域で使用中のメモリサイズよりも小さいと,フルガーベージコレクションが発生してしまいます。

これを防ぐために,Tenured領域には,アプリケーションが必要とするメモリサイズに加えて,DefNew領域分のメモリサイズを追加してください。

考え方を次の図に示します。

図8-10 DefNew領域のメモリサイズを追加する理由の考え方

[図データ]

なお,DefNew領域のメモリサイズの見積もりについては,「8.4 DefNew領域のメモリサイズの見積もり」で説明します。

ポイント
拡張verbosegc情報などで確認したときに,コピーガーベージコレクションが発生しないでフルガーベージコレクションが頻発している場合,DefNew領域からの退避オブジェクトに対してTenured領域のメモリサイズが小さいことが考えられます。DefNew領域のサイズを増やした場合などにこの状態になることがあります。必要に応じて,Tenured領域のメモリサイズを見直してください。また,DefNew領域内のEden領域とSurvivor領域の関係もあわせて見直してください。