付録A.3 HTTPセッションを作成するタイミングを考慮する
HTTPセッションを作成するタイミングを考慮したアプリケーションの実装方法,およびJ2EEサーバのログによる確認方法について説明します。
- 〈この項の構成〉
(1) アプリケーション実装時の考慮点
アプリケーションで使用しないHTTPセッションは作成しないようにすると,Explicitメモリブロックのメモリ効率が良くなります。J2EEサーバには,暗黙的にHTTPセッションを使用する機能があるため,注意が必要です。
ExplicitメモリブロックとHTTPセッションは1対1で対応します。また,一つのExplicitメモリブロックの最小サイズは,16キロバイト(デフォルトの場合は64キロバイト)です。HTTPセッションを一つ作成すると,HTTPセッションに格納するオブジェクトがなくても,Explicitヒープ領域を16キロバイト使用します。このため,実際には使用しないHTTPセッションは作成しないほうがメモリ効率は良くなります。例えば,使用しないHTTPセッションをサーブレットへのアクセスごとに作成し,HTTPセッションのタイムアウトまで破棄しないアプリケーションがあったとします。タイムアウトが30分,30分に1万回のサーブレットへのアクセスがあるとすると,16キロバイト×1万=160メガバイト(デフォルトの場合は640メガバイト)のExplicitヒープ領域を使用します。
また,JSPでは,デフォルトでアクセスごとにHTTPセッションを作成します。このため,HTTPセッションが不要な処理(例えば,J2EEサーバのヘルスチェック)でJSPを使用している場合は,不要なHTTPセッションのオブジェクトが生成されてExplicitヒープがあふれるおそれがあります。セッションを必要としないJSPでは,明示的にHttpSessionオブジェクトを作成しない設定にしてください。設定には,pageディレクティブのsession属性を使用します。
アプリケーションが変更できない場合は,HTTPセッションで利用するExplicitヒープの省メモリ化機能の利用を検討してください。HTTPセッションで利用するExplicitヒープの省メモリ化機能については,マニュアル「アプリケーションサーバ 機能解説 拡張編」の「7.11 HTTPセッションで利用するExplicitヒープのメモリ使用量の削減」を参照してください。この機能を利用すると,HTTPセッションの破棄前でも利用率の低いExplicitメモリブロックに格納されていたオブジェクトをほかの領域に移動して集約して,利用率の低いExplicitメモリブロックを自動解放します。アプリケーションサーバ内でのHTTPセッションとExplicitメモリブロックの関係が多対1になります。複数のHTTPセッションで一つのExplicitメモリブロックを共有できるため,Explicitメモリブロックの利用率が向上します。これによって,HTTPセッションが確保するExplicitヒープのメモリ使用量を削減できます。
(2) J2EEサーバログによる確認方法
不要なHTTPセッションに対応するExplicitメモリブロックが作成されていないかどうかは,スレッドダンプの内容から確認します。
確認手順を次に示します。
-
J2EEサーバを起動し,業務を実行します。
アプリケーションで暗黙的にHTTPセッションを使用していることもあるので,HTTPセッションを使用する業務に絞り込まないようにしてください。
-
業務の実行中に,eheapprofコマンドを実行してスレッドダンプを取得します。
Explicitヒープ情報に出力された,「used/total」(Explicitメモリブロック利用率)と,「spaces exist」(有効なExplicitメモリブロックの数)の値を確認します。
出力例を次に示します。
max 31415926K, total 162816K, used 150528K, garbage 10004K (0.0% used/max, 91.1% used/total, 6.6% garbage/used), 3 spaces exist
この例では,「used/total」の値が91.1%となっています。この値が100%に近いほどメモリ効率がよい状態です。この値が1けただったり,「spaces exist」の値が想定するHTTPセッションの数を大幅に上回ったりしていないかを確認します。