Hitachi

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


付録A.1 HTTPセッションに格納するオブジェクトの寿命を考慮する

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

〈この項の構成〉

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

HTTPセッションには,HTTPセッションが破棄されるときに解放されるオブジェクトだけを格納することをお勧めします。このようなオブジェクトの割合が多いと,自動解放処理の時間が短くなります。HTTPセッションが破棄されたあとも残存するオブジェクトがあると,新たなExplicitメモリブロックが生成され,オブジェクトはそこに移動され,以降の自動解放処理の対象となります。また,移動されたオブジェクトは,HTTPセッションと対応しないオブジェクトとなります。

明示管理ヒープ機能では,setAttributeメソッドでHTTPセッションに格納したオブジェクトから直接または間接的に参照されているオブジェクトは,HTTPセッションに格納されていると見なします。これらのオブジェクトは,昇格するタイミングでExplicitメモリブロックに移動します。HTTPセッションに格納したオブジェクトからの参照関係が複雑になると,HTTPセッションを破棄したあとも使用され続けるオブジェクトが,HTTPセッションに格納されてしまう可能性が高くなります。

このため,HTTPセッションに格納するオブジェクトは,String型のオブジェクトや,プリミティブ型またはプリミティブ型配列を格納した場合など,できるだけシンプルにするのをお勧めします。

アプリケーションの設計上,HTTPセッションが破棄したあとも使用され続けるオブジェクトをHTTPセッションに格納する必要がある場合は,明示管理ヒープ機能適用除外クラス指定機能の利用を検討してください。明示管理ヒープ機能適用除外クラス指定機能については,マニュアル「アプリケーションサーバ 機能解説 拡張編」の「7.10 Explicitメモリブロックの自動解放処理に掛かる時間の短縮」を参照してください。

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

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

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

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

  2. HTTPセッションが破棄されたあと,eheapprofコマンドを実行してスレッドダンプを取得します。

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

    "NULL"のExplicitメモリブロックがない場合は,HTTPセッションが破棄されたあとも使用され続けるオブジェクトがないことを示します。

    "NULL"のExplicitメモリブロックがある場合は,「used」(Explicitメモリブロックの利用済みサイズ)の値を確認します。

    出力例を次に示します。

    "NULL" eid=1(0x02f25610)/A, total 542K, used 501K, garbage 0K (92.4% used/total, 0.0% garbage/used, 0 blocks) Enable

    このExplicitメモリブロックには,HTTPセッションが破棄されたあとも使用され続けるオブジェクトがあることを示します。ただし,「used」の値が数キロバイト〜数メガバイト程度の場合は,自動解放処理時間に大きな影響を与えることはありません。

(3) HTTPセッションの破棄後にHTTPセッションに格納したオブジェクトが使用される仕組み

HTTPセッションが破棄したあともHTTPセッションに格納したオブジェクトが使用されてしまう仕組みを説明します。ここでは,代表的な例として,HTTPセッションに格納したオブジェクトから共有データ(オブジェクト)を参照する例を次の図に示します。

図A‒1 HTTPセッションに格納したオブジェクトから共有データ(オブジェクト)を参照する例

[図データ]

この例は,setAttributeメソッドでHTTPセッションに格納したオブジェクトから共有データであるオブジェクトAを参照している例です。オブジェクトAはHTTPセッションに格納されていないようにも見えますが,参照関係に基づくオブジェクトの移動によって,参照元のどれかのHTTPセッションに対応するExplicitメモリブロックに移動します。この例では,Explicitメモリブロック1に移動するとします。参照関係の基づくオブジェクトの移動については,マニュアル「アプリケーションサーバ 機能解説 拡張編」の「7.6.5 参照関係に基づくオブジェクトのJavaヒープからExplicitメモリブロックへの移動」を参照してください。

このあと,Explicitメモリブロック1に対応するHTTPセッションが破棄されて,自動解放処理が発生すると,外部(解放対象外のExplicitメモリブロック)から参照されているオブジェクトAは,新規のExplicitメモリブロックxに移動されます。このExplicitメモリブロックxはHTTPセッションと対応していないExplicitメモリブロックとなります。HTTPセッションを破棄したあとのExplicitメモリブロックの状態を次の図に示します。

図A‒2 HTTPセッションを破棄したあとのExplicitメモリブロックの状態

[図データ]

HTTPセッションの破棄と対応した自動解放は,対象となるExplicitメモリブロックに使用中のオブジェクトが多いほど,処理に時間が掛かります。また,HTTPセッションの破棄と対応した自動解放処理時に使用中のオブジェクトは,HTTPセッションとは対応しないExplicitメモリブロックに移動され,自動解放処理の対象となります。このオブジェクトを解放できない期間が長いほど,このオブジェクトが自動解放処理の対象となる回数が増え,スループットやレイテンシの悪化につながることがあります。

この例の場合,共有データであるオブジェクトAへの参照は,n個のHTTPセッションが一つもなくなるまで消えないと考えられます。その間は,新規のExplicitメモリブロックxの自動解放処理を繰り返すことになり,効率が悪くなります。共有データのサイズが小さければ,特に大きな影響はありませんが,数百メガバイト以上の巨大なサイズの場合は,自動解放処理時間への影響が大きく,スループットやレイテンシの悪化の原因となることがあります。