7.14.2 HTTPセッションに関するオブジェクトでExplicitヒープを利用する際の注意
-
HTTPセッション生成以降,setAttributeメソッドで設定したすべてのセッション属性(オブジェクト)は,HTTPセッションを破棄するまで解放されないで,Explicitヒープに残存します。その時点でHTTPセッションに設定されているかどうかは関係ありません。このため,HTTPセッションを破棄しないでsetAttributeメソッドを繰り返し実行した場合,Explicitヒープあふれが発生して,FullGC抑止の効果が得られないおそれがあります。Explicitヒープあふれが発生しているかどうかを確認するには,マニュアル「アプリケーションサーバ システム設計ガイド」の「7.14.3 Explicitヒープあふれが発生した場合の確認と対処」を参照してください。
-
自動解放機能を利用しない場合(-XX:-HitachiExplicitMemoryAutoReclaimの場合)で,HTTPセッションを削除する時に,そのセッションに格納したオブジェクトへの外部からの参照が残っているオブジェクトは,ExplicitヒープからJavaヒープのTenured領域に移動します。この場合,Tenured領域の使用済みサイズが増加することになり,FullGCの発生を抑止できません。
ExplicitヒープからJavaヒープへのオブジェクトの移動を防ぐためには,HTTPセッションを破棄する前に,セッションに格納したオブジェクトへの参照を削除する必要があります。
次のAPIを使用して取得したオブジェクトへの参照が残っている場合も同様です。
-
getAttribute(String)
-
getAttributeNames()
なお,自動解放機能を利用する場合(-XX:+HitachiExplicitMemoryAutoReclaimの場合)は,それらのオブジェクトがJavaヒープのTenured領域に移動することはありません。
-
-
次の場合,オブジェクトはExplicitヒープではなくJavaヒープに配置されます。
-
Explicitメモリブロックの数が最大値になっており,新たにExplicitメモリブロックを作成できない場合(同時に存在するExplicitメモリブロックが1,048,575個になっている場合)に,新しいセッションを生成した場合
-
Explicitヒープ領域の最大サイズを超えた場合
-
Explicitメモリブロックを確保できなかった場合
これらに該当する場合,オブジェクトはJavaヒープに作成されるため,FullGCの発生抑止ができないおそれがあります。
-
-
JSPでは,デフォルトで暗黙的にHttpSessionオブジェクトが作成されます。不要なHttpSessionオブジェクトの生成によるExplicitヒープあふれを防ぐため,セッションを必要としないJSPでは,明示的にHttpSessionオブジェクトを作成しない設定にしてください。設定には,pageディレクティブのsession属性を使用します。
-
FullGC抑止の効果を検証するテストを実行する場合,セッションを破棄しないままで連続してセッションを生成し続けるような条件では実行しないでください。Explicitメモリブロックが解放されないため,Explicitヒープがあふれる可能性が高くなります。
また,Explicitメモリブロックは,セッションが破棄されたときに解放予約され,その後,GCが発生したときに解放されます。このため,セッションを破棄していても,セッションの破棄と生成の繰り返し回数が1回のGC間隔に対して多過ぎる場合には,解放予約されたExplicitメモリブロックが残存したままの状態で別のExplicitメモリブロックが作成されてしまいます。その結果,Explicitメモリブロックの個数が増加し,Explicitヒープがあふれるおそれがあります。
FullGC抑止の効果を検証するには,セッションを適切に管理する条件でテストを実行してください。
-
セッションに格納したオブジェクトは,生成直後はJavaヒープに配置されます。何度かCopyGCが実行されたあと,通常はTenured領域に昇格するタイミングでExplicitヒープに移動します。このため,短時間で削除される場合や,セッションがすぐに破棄される場合は,オブジェクトはExplicitヒープには配置されません。