Hitachi

Cosminexus V11 アプリケーションサーバ 機能解説 拡張編


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

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

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

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

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

[図データ]

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

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

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

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

[図データ]

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

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

HTTPセッションを作成したとき

新しくHTTPセッションを作成すると,Explicitヒープ領域にExplicitメモリブロックが作成されます。Explicitメモリブロックは,1セッションに一つ割り当てられます。また,HTTPセッションが,Explicitメモリブロック内に確保されます。

ただし,セッション作成直後のオブジェクトの配置先はJavaヒープです。何回かのCopyGCのあと,該当するJavaオブジェクトが昇格するタイミングで,オブジェクトがExplicitヒープに移動します。

HTTPセッションにオブジェクトが格納されたとき(setAttributeメソッドを実行したとき)

javax.servlet.http.HttpSession.setAttributeメソッドでHTTPセッションに格納したオブジェクトは,セッションごとに割り当てられたExplicitメモリブロックに配置されます。

ただし,setAttributeメソッド実行時のオブジェクトの配置先はJavaヒープです。何回かのCopyGCのあと,該当するJavaオブジェクトが昇格するタイミングで,オブジェクトがExplicitヒープに移動します。このとき,移動するオブジェクトから参照されているオブジェクトは,すべてExplicitヒープに移動します。ただし,Explicitメモリブロックへのオブジェクト移動制御オプションの指定によって,Explicitヒープに移動しなくなることがあります。

HTTPセッションからオブジェクトが削除されたとき(removeAttributeメソッドを実行したとき)

Explicitヒープは,GCの対象外です。このため,javax.servlet.http.HttpSession.removeAttributeメソッドを実行してHTTPセッションからオブジェクトを削除しても,オブジェクトが使用していた領域は解放されません。

なお,setAttributeメソッドで属性を変更した場合も,変更前の属性はGCの対象にならないため,オブジェクトが使用していた領域は解放されません。

メモリの解放は,Explicitメモリブロック単位で実行されます。setAttributeメソッドを繰り返し頻繁に実行するようなWebアプリケーションの場合,removeAttributeメソッドを実行してもExplicitメモリブロック内の領域を不要に消費してしまうおそれがありますので,注意してください。

HTTPセッションが破棄されるとき

HTTPセッション作成時に作成されたExplicitメモリブロックは,HTTPセッションが破棄されるときに,Webコンテナによって解放が予約されます。

解放が予約されたExplicitメモリブロックは,そのあとでCopyGCまたはFullGCが実行されたときに,実際に解放されます。このとき,解放が予約されたすべての領域が解放されます。

なお,Explicitメモリブロックを解放したあとで,セッションに格納したオブジェクトへの参照が残っていた場合については,次の説明を参照してください。

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

表7‒3 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ヒープの省メモリ化機能を使用することで削減できます。詳細は,「7.11 HTTPセッションで利用するExplicitヒープのメモリ使用量の削減」を参照してください。また,マニュアル「アプリケーションサーバ システム設計ガイド」の「付録A HTTPセッションで利用するExplicitヒープの効率的な利用」を参照してアプリケーションを実装すると,HTTPセッションに明示管理ヒープ機能を効率良く適用できます。