8.4.1 HTTPセッションに関するオブジェクト

HTTPセッションに格納するオブジェクトは,セッションが有効な間保持されるオブジェクトです。生存期間は,セッションの生成から破棄までの間です。

このオブジェクトは,明示管理ヒープ機能を使用していない場合,何回かのコピーガーベージコレクションが実行される間使用され続けることが多いオブジェクトです。このため,長寿命オブジェクトとしてTenured領域に昇格しやすくなります。Tenured領域に昇格したオブジェクトはコピーガーベージコレクションでは回収されないため,このオブジェクトはセッションが破棄されたあとも回収されません。このため,Tenured領域のメモリ使用量が増加していき,フルガーベージコレクションが発生します。

明示管理ヒープ機能を利用していない場合の例を次の図に示します。

図8-7 明示管理ヒープ機能を利用していない場合の例

[図データ]

1.でセッションを生成すると,New領域にオブジェクトを格納するための領域が確保されます。2.でセッションにオブジェクトが格納されます。何回かのコピーガーベージコレクションのあと,1.および2.のオブジェクトはTenured領域に移動します。3.でセッションが無効化された場合も,Tenured領域のオブジェクトは回収されないため,メモリ使用量が増加していきます。

これに対して,HTTPセッションに関するオブジェクトの昇格先をTenured領域からExplicitヒープに変更することによって,フルガーベージコレクション発生を抑止できます。

明示管理ヒープ機能を利用した例を次の図に示します。

図8-8 明示管理ヒープ機能を利用した例

[図データ]

明示管理ヒープ機能を使用すると,HTTPセッションに関するオブジェクトによるTenured領域の増加がありません。このため,フルガーベージコレクション発生を抑止できます。なお,Explicitヒープに配置したJavaオブジェクトは,セッションが破棄されたあと,J2EEサーバによって明示的に解放されます。

HTTPセッションを配置するExplicitメモリブロック領域の確保および解放のタイミングについて説明します。

HTTPセッションを作成したとき
新しくHTTPセッションを作成すると,Explicitヒープ領域にExplicitメモリブロックが作成されます。Explicitメモリブロックは,1セッションに一つ割り当てられます。また,HTTPセッションが,Explicitメモリブロック内に確保されます。
ただし,セッション作成直後のオブジェクトの配置先はJavaヒープです。何回かのコピーガーベージコレクションのあと,該当するJavaオブジェクトが昇格するタイミングで,オブジェクトがExplicitヒープに移動します。
HTTPセッションにオブジェクトが格納されたとき(setAttributeメソッドを実行したとき)
javax.servlet.http.HttpSession.setAttributeメソッドでHTTPセッションに格納したオブジェクトは,セッションごとに割り当てられたExplicitメモリブロックに配置されます。
ただし,setAttributeメソッド実行時のオブジェクトの配置先はJavaヒープです。何回かのコピーガーベージコレクションのあと,該当するJavaオブジェクトが昇格するタイミングで,オブジェクトがExplicitヒープに移動します。このとき,移動するオブジェクトから参照されているオブジェクトは,すべてExplicitヒープに移動します。
HTTPセッションからオブジェクトが削除されたとき(removeAttributeメソッドを実行したとき)
Explicitヒープは,ガーベージコレクションの対象外です。このため,javax.servlet.http.HttpSession.removeAttributeメソッドを実行してHTTPセッションからオブジェクトを削除しても,オブジェクトが使用していた領域は解放されません。
なお,setAttributeメソッドで属性を変更した場合も,変更前の属性はガーベージコレクションの対象にならないため,オブジェクトが使用していた領域は解放されません。
メモリの解放は,Explicitメモリブロック単位で実行されます。setAttributeメソッドを繰り返し頻繁に実行するようなWebアプリケーションの場合,removeAttributeメソッドを実行してもExplicitメモリブロック内の領域を不要に消費してしまうおそれがありますので,注意してください。
HTTPセッションが破棄されるとき
HTTPセッション作成時に作成されたExplicitメモリブロックは,HTTPセッションが破棄されるときに,Webコンテナによって解放が予約されます。
解放が予約されたExplicitメモリブロックは,そのあとでコピーガーベージコレクションまたはフルガーベージコレクションが実行されたときに,実際に解放されます。このとき,解放が予約されたすべての領域が解放されます。
なお,Explicitメモリブロックを解放したあとで,セッションに格納したオブジェクトへの参照が残っていた場合,そのオブジェクトはJavaヒープに移動します。

Webアプリケーションで実行される操作または動作とJavaVMの動作の対応を次の表に示します。

表8-4 Webアプリケーションで実行される操作(API)とJavaVMの動作の対応

Webアプリケーションで実行される操作(API)または動作Webコンテナの動作JavaVMの動作
  • javax.servlet.http.HttpServletRequest.getSession()
  • javax.servlet.http.HttpServletRequest.getSession(boolean)
セッションの生成Explicitメモリブロックの確保
  • javax.servlet.http.HttpSession.setAttribute(String, Object)
セッションへのオブジェクトの格納Explicitメモリブロックへのオブジェクトの配置
  • セッションのタイムアウト
  • javax.servlet.http.HttpSession.invalidate()
セッションの破棄Explicitメモリブロックの解放

HTTPセッションとは別に,HTTPセッション管理用オブジェクトのために,Webアプリケーション数+2個のExplicitメモリブロックがWebコンテナの内部で使用されます。

注※ Webコンテナで,内部的に2個の管理用オブジェクトを持つため,その個数を加算します。


なお,HTTPセッションで使用するExplicitヒープのメモリサイズは,HTTPセッションで利用するExplicitヒープの省メモリ化機能を使用することで削減できます。詳細は,「8.9 HTTPセッションで利用するExplicitヒープのメモリ使用量の削減」を参照してください。