Hitachi

Cosminexus V11 アプリケーションサーバ システム設計ガイド


付録A.2 HTTPセッションに格納するオブジェクトの更新頻度を考慮する

HTTPセッションに格納するオブジェクトの更新頻度を考慮したアプリケーションの実装方法,およびJ2EEサーバのログによる確認方法について説明します。

〈この項の構成〉

(1) アプリケーション実装時の考慮点

HTTPセッションに格納したオブジェクトの更新回数が少ないほど,Explicitメモリブロックのメモリ効率が良くなります。例えば,setAttributeメソッドを第1引数の「name」が同じ値で複数回呼び出すと,同じ値で呼び出した回数分だけ第2引数の「value」のオブジェクトが更新されます。これがオブジェクトの更新回数となります。

HTTPセッションに格納したオブジェクトが更新されると,更新前のオブジェクトは使用済みになりますが,そのメモリ領域はHTTPセッションの破棄まで解放されません。このため,更新回数が少ないほどメモリ効率は良くなります。オブジェクトの更新を,短い周期(CopyGC間隔の10倍程度以下の周期)で繰り返す場合は問題ありませんが,長い周期で繰り返すと長寿命オブジェクトとなってExplicitメモリブロックに移動するため,注意してください。Explicitメモリブロックに移動したオブジェクトは,使用済みとなっても,HTTPセッションの破棄まで解放されません。明示管理ヒープ機能を適用しない場合,このようなオブジェクトはフルガーベージコレクション発生時に解放されます。特に,日中はHTTPセッションが破棄されないといった,HTTPセッションの生存期間が長いシステムの場合は,長い周期でオブジェクトの更新を繰り返す状況となりやすいことがあります。

アプリケーションの設計上,HTTPセッションに格納したオブジェクトの更新回数が多くなる場合は,次の点を考慮して,明示管理ヒープ機能の適用可否を判断してください。

(2) J2EEサーバログによる確認方法

HTTPセッションに格納するオブジェクトの更新頻度は,スレッドダンプの内容から確認します。

確認手順を次に示します。

  1. J2EEサーバを起動し,HTTPセッションが破棄される直前までの業務を実行します。

  2. eheapprofコマンドを実行してスレッドダンプを取得します。

  3. <EM_NAME>が"CCC#HttpSession"のExplicitメモリブロックを検索します。

    "CCC#HttpSession"のExplicitメモリブロックは,HTTPセッションと対応するブロックです。「used」(Explicitメモリブロックの利用済みサイズ)の値と,アプリケーション開発時に算出して見積もったHTTPセッションに格納するオブジェクトの合計サイズを比較します。オブジェクトの更新頻度が高いと,二つの値に大きな差が生じ,「used」の値が大きくなります。

    出力例を次に示します。

    "CCC#HttpSession" eid=97(0x02f25610)/R, total 16K, used 8K, garbage 0K (50.1% used/total, 0.0% garbage/used, 0 blocks) Enable

(3) Explicitメモリブロックに使用済みのHTTPセッションに関するオブジェクトが残存する仕組み

更新を繰り返した結果,使用済みのHTTPセッションに関するオブジェクトが,Explicitメモリブロックに残存してしまう仕組みを説明します。ここで説明するオブジェクトは,HTTPセッションの破棄よりも生存期間が短い長寿命オブジェクトです。

明示管理ヒープ機能が有効な場合と明示管理ヒープ機能が無効な場合のオブジェクトの解放処理の違いを次の図に示します。

図A‒3 明示管理ヒープ機能が有効な場合と明示管理ヒープ機能が無効な場合のオブジェクトの解放処理の違い

[図データ]

この図は,HTTPセッションが長時間破棄されない例です。時刻2では,オブジェクトの更新によって,4個のオブジェクトが使用済みとなります。時刻3では,明示管理ヒープ機能が無効な場合,Tenured領域のサイズがフルガーベージコレクションを発生するためのしきい値を超えたため,フルガーベージコレクション(図中のFullGC発生が該当します)が発生し,使用済みのオブジェクトは解放されます。明示管理ヒープ機能が有効な場合,フルガーベージコレクションが発生しないため,使用済みのオブジェクトは解放されないで残ります。さらに時間が経過した時刻nでも,HTTPセッションはまだ破棄されません。明示管理ヒープ機能が無効な場合,しきい値によるフルガーベージコレクションの発生でTenured領域の使用済みのオブジェクトは解放されます。明示管理ヒープ機能が有効な場合,HTTPセッションが破棄されるまで自動解放処理が発生しないため,使用済みで解放されていないオブジェクトが残り,Explicitヒープがあふれる可能性が高くなります。

この例の時刻nでは,使用済みで解放されていないオブジェクトは16個ですが,長時間(例えば,日中の間など)HTTPセッションを破棄しないことを要件とするシステムでは,さらに多くの使用済みのオブジェクトが解放されない状況になるおそれがあります。