7.4.1 Javaヒープのメモリサイズの見積もり
JavaVMのチューニングでは,JavaVM固有領域の各領域のメモリサイズを適切に見積もる必要があります。
見積もりのポイントになるメモリサイズは次のとおりです。
-
Javaヒープ全体のメモリサイズ
-
Tenured領域のメモリサイズ
-
Survivor領域のメモリサイズ
-
Eden領域のメモリサイズ
このほか,Metaspace領域も,必要に応じて見積もります。
CopyGC後の生存オブジェクトのサイズがSurvivor領域のサイズよりも大きい場合,Survivor領域があふれ,1度のCopyGCの実行でTenured領域に昇格するオブジェクトが発生します。また,Survivor領域のサイズが小さい場合に,Survivor領域の使用率が上がってくると,本来短寿命(CopyGC間隔以下,またはCopyGC間隔の1〜2倍程度の寿命)のJavaオブジェクトが,数回のCopyGCの実行でTenured領域に昇格してしまいます。
- ポイント
-
次に示す問題が確認できた場合は,Survivor領域の不足が原因でFullGCが発生しています。なお,拡張verbosegc情報とは,J2EEサーバ起動時にオプションを設定しておくと,GC発生時にJavaVMログファイルに出力される情報です。
-
Tenured領域の増加要因が短寿命オブジェクトであると特定された場合
-
拡張verbosegc情報で,CopyGC時のSurvivor領域あふれが確認できた場合
-
-XX:+HitachiVerboseGCPrintTenuringDistribution指定時に出力される拡張verbosegc情報で,オブジェクトの昇格年齢が常に1であることが観測できた場合
これらの問題を回避するためには,-XX:SurvivorRatioオプションの設定値を小さくして,Eden領域とSurvivor領域の割合を最適化する必要があります。
-
このことを考慮し,見積もりでは,まず,Tenured領域のメモリサイズとNew領域のメモリサイズを算出して,それらを基にJavaヒープ全体のメモリサイズを算出します。
メモリサイズを見積もる順序を次の図に示します。図中の番号の順番で見積もりを実施します。
見積もり手順を示します。なお,番号は図中の番号と対応しています。
-
Tenured領域で使用するメモリサイズを見積もります。
見積もり方法については,「7.5 Javaヒープ内のTenured領域のメモリサイズの見積もり」を参照してください。
-
Survivor領域で使用するメモリサイズを見積もります。
見積もり方法については,「7.6.1 Javaヒープ内のSurvivor領域のメモリサイズの見積もり」を参照してください。
-
Eden領域で使用するメモリサイズを見積もります。
見積もり方法については,「7.6.2 Javaヒープ内のEden領域のメモリサイズの見積もり」を参照してください。
-
2.と3.の合計として,New領域全体のメモリサイズを算出します。
-
一定期間存在するオブジェクトの扱いを検討して,必要なメモリサイズをTenured領域またはNew領域のメモリサイズに追加します。
検討方法については,「7.7 Javaヒープ内に一定期間存在するオブジェクトの扱いの検討」を参照してください。
-
1.,4.および5.の合計として,Javaヒープ全体のメモリサイズを算出します。
-
必要に応じてMetaspace領域のメモリサイズを見積もります。
見積もり方法については,「7.9 Javaヒープ内のMetaspace領域のメモリサイズの見積もり」を参照してください。