5.12 リダイレクタとの通信用オブジェクト
Explicitメモリブロック領域の確保や解放は,Webコンテナによって実行されます。Webコンテナとリダイレクタ間の通信に使用する通信用オブジェクトは,通常は常設コネクションとして使い回され,Webサーバが起動している間は保持されます。
Webコンテナとリダイレクタの間で障害が発生した場合などに通信の切断・再接続が発生すると,通信用オブジェクトは破棄・再生成されます。このとき,破棄された通信用オブジェクトがTenured領域に残ります。
これを防ぐため,J2EEサーバでは,Webコンテナとリダイレクタ間の通信用オブジェクトをExplicitヒープに配置します。これによって,不要なオブジェクトがTenured領域に残ることを防ぎ,FullGCの発生を抑止します。
通信の確立と切断のタイミングに対応するExplicitメモリブロックの配置の流れについて説明します。
- 通信が確立されたとき
-
通信が確立されると,コネクション1個に対して1個のExplicitメモリブロックが作成されます。作成されたExplicitメモリブロックに,リダイレクタとの通信用オブジェクトが配置されます。
- 通信が切断されたとき
-
通信が切断されると,Explicitメモリブロック内に配置されたリダイレクタとの通信用オブジェクトごと,1個のExplicitメモリブロックの解放が予約されます。
通信が切断された直後は,解放が予約された状態です。解放が予約されたExplicitメモリブロックは,そのあとでCopyGCまたはFullGCが実行されたときに実際に解放されます。このとき,解放が予約されたすべての領域が解放されます。