Hitachi

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


7.7.1 Javaヒープ内のNew領域に格納する方法

一定期間存在するオブジェクトをNew領域で管理する方法です。New領域のメモリサイズに,これらの一定期間存在するオブジェクト分のメモリサイズを追加して見積もります。

New領域サイズを大きくしてオブジェクトのTenured領域への移動を抑止することによって,FullGCの発生も抑止できます。ただし,CopyGC実行時にNew領域内にある使用中オブジェクトの数が増えるため,New領域内でのコピー処理に時間が掛かり,1回当たりのCopyGC実行時間は長くなります。CopyGCの実行時間がFullGC実行時間よりも長くなるような場合は,メモリサイズの再見積もりが必要です。また,メモリ空間のサイズ設定によっては,本来CopyGCで回収されるはずの寿命の短いオブジェクトが使用する領域が不足して,Tenured領域への退避が発生するおそれがあります。この場合は,最終的にはFullGCが発生してしまいます。

なお,一定期間存在するオブジェクトをNew領域で管理できているかどうかは,拡張verbosegc情報で確認できます。実際にアプリケーションを動作させて,出力された拡張verbosegc情報で,CopyGC発生後のTenured領域のメモリサイズが大幅に増えていないことを確認してください。

New領域での管理に失敗している場合,システムの処理性能が大幅に低下していることがあります。また,New領域で管理できるオブジェクトの最大の年齢には限界があります(限界はプラットフォームやバージョンによって異なります。詳細は,マニュアル「アプリケーションサーバ リファレンス 定義編(サーバ定義)」の「14.4 Application Serverで指定できるJava HotSpot VMのオプションのデフォルト値」の-XX:MaxTenuringThreshold=<value>を参照してください)。New領域で管理できていないことがわかった場合は,一定期間存在するオブジェクトは,Tenured領域に格納して管理することを検討してください。Tenured領域で管理する方法については,「7.7.2 Javaヒープ内のTenured領域に格納する方法」を参照してください。