Hitachi

Cosminexus V11 アプリケーションサーバ システム設計ガイド


7.5.2 Javaヒープ内のNew領域のメモリサイズを追加する理由

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

通常,Eden領域がいっぱいになると,CopyGCが発生します。このとき,Eden領域とSurvivor領域のFrom空間に存在する使用中のJavaオブジェクトが,Survivor領域のTo空間に移動しようとします。このとき,Tenured領域の未使用領域がEden領域とSurvivor領域で使用中のメモリサイズよりも小さいと,New領域のすべてのJavaオブジェクトが昇格した場合に,JavaオブジェクトをTenured領域に移動できなくなります。そこでJavaVMは,FullGCを発生させ,Tenured領域の未使用メモリサイズを増やそうとします。

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

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

図7‒11 New領域のメモリサイズを追加する理由の考え方

[図データ]

なお,New領域のメモリサイズの見積もりについては,「7.6 Javaヒープ内のNew領域のメモリサイズの見積もり」で説明します。

ポイント

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