Cosminexus アプリケーションサーバ V8 機能解説 拡張編
![[目次]](FIGURE/CONTENT.GIF)
![[用語]](FIGURE/GLOSS.GIF)
![[索引]](FIGURE/INDEX.GIF)
![[前へ]](FIGURE/FRONT.GIF)
Javaヒープの初期サイズ(-Xms)と最大サイズ(-Xmx)には,必ず同じ値を指定してください。同じ設定でない場合,コピーガーベージコレクションの回数が増加するおそれがあります。
なお,この設定は,明示管理ヒープ機能を使用しない場合にも推奨の設定です。
- 補足:
- Javaヒープの初期サイズと最大サイズが異なる場合,各領域のサイズは,次のタイミングで変更されます。
- コピーガーベージコレクション終了時
New領域のサイズが動的に変更されます。
- フルガーベージコレクション終了時
Tenured領域とNew領域のサイズが動的に変更されます。
- New領域のサイズは,主にTenured領域のサイズと-XX:NewRatioオプションに指定した値によって決まります。
- 明示管理ヒープ機能によってフルガーベージコレクションの発生が抑止されると,Tenured領域のサイズが変更されるタイミングがなくなります。これに伴って,New領域のサイズも,ほぼ一定になります。
- このため,初期サイズよりも大きい最大サイズを定義していても,New領域が拡張されるタイミングがなくなり,初期サイズで指定したままのサイズになります。初期サイズで指定したNew領域が小さい場合,明示管理ヒープ機能を使用しない場合に比べて,コピーガーベージコレクションが多く発生するおそれがあります。
- HTTPセッション生成以降,setAttributeメソッドで設定したすべてのセッション属性(オブジェクト)は,HTTPセッションを破棄するまで解放されないで,Explicitヒープに残存します。その時点でHTTPセッションに設定されているかどうかは関係ありません。このため,HTTPセッションを破棄しないでsetAttributeメソッドを繰り返し実行した場合,Explicitヒープあふれが発生して,フルガーベージコレクション抑止の効果が得られないおそれがあります。Explicitヒープあふれが発生しているかどうかを確認するには,マニュアル「Cosminexus アプリケーションサーバ システム設計ガイド」の「7.11.4 アプリケーション開発・運用時の確認・調査」を参照してください。
- 自動解放機能を利用しない場合(-XX:-HitachiExplicitMemoryAutoReclaimの場合)において,HTTPセッションを削除する時に,そのセッションに格納したオブジェクトへの外部からの参照が残っているオブジェクトは,ExplicitヒープからJavaヒープのTenured領域に移動します。この場合,Tenured領域の使用済みサイズが増加することになり,フルガーベージコレクションの発生を抑止できません。
ExplicitヒープからJavaヒープへのオブジェクトの移動を防ぐためには,HTTPセッションを破棄する前に,セッションに格納したオブジェクトへの参照を削除する必要があります。
次のAPIを使用して取得したオブジェクトへの参照が残っている場合も同様です。
- getAttribute(String)
- getAttributeNames()
なお,自動解放機能を利用する場合(-XX:+HitachiExplicitMemoryAutoReclaimの場合)は,それらのオブジェクトがJavaヒープのTenured領域に移動することはありません。
- 次の場合,オブジェクトはExplicitヒープではなくJavaヒープに配置されます。
- Explicitメモリブロックの数が最大値になっており,新たにExplicitメモリブロックを作成できない場合(同時に存在するExplicitメモリブロックが1,048,575個になっている場合)に,新しいセッションを生成した場合
- Explicitヒープ領域の最大サイズを超えた場合
- Explicitメモリブロックを確保できなかった場合
これらに該当する場合,オブジェクトはJavaヒープに作成されるため,フルガーベージコレクションの発生抑止ができないおそれがあります。
- JSPでは,デフォルトで暗黙的にHttpSessionオブジェクトが作成されます。不要なHttpSessionオブジェクトの生成によるExplicitヒープあふれを防ぐため,セッションを必要としないJSPでは,明示的にHttpSessionオブジェクトを作成しない設定にしてください。設定には,pageディレクティブのsession属性を使用します。
- フルガーベージコレクション抑止の効果を検証するテストを実行する場合,セッションを破棄しないままで連続してセッションを生成し続けるような条件では実行しないでください。Explicitメモリブロックが解放されないため,Explicitヒープがあふれる可能性が高くなります。
また,Explicitメモリブロックは,セッションが破棄されたときに解放予約され,その後,ガーベージコレクションが発生したときに解放されます。このため,セッションを破棄していても,セッションの破棄と生成の繰り返し回数が1回のガーベージコレクション間隔に対して多過ぎる場合には,解放予約されたExplicitメモリブロックが残存したままの状態で別のExplicitメモリブロックが作成されてしまいます。その結果,Explicitメモリブロックの個数が増加し,Explicitヒープがあふれるおそれがあります。
フルガーベージコレクション抑止の効果を検証するには,セッションを適切に管理する条件でテストを実行してください。
- セッションに格納したオブジェクトは,生成直後はJavaヒープに配置されます。何度かコピーガーベージコレクションが実行されたあと,通常はTenured領域に昇格するタイミングでExplicitヒープに移動します。このため,短時間で削除される場合や,セッションがすぐに破棄される場合は,オブジェクトはExplicitヒープには配置されません。
All Rights Reserved. Copyright (C) 2008, 2011, Hitachi, Ltd.