明らかに、ある時点でオブジェクトが作成され、破棄され/プールに戻されます。私は特にこれらがどのようにガベージコレクションされているかに興味があります。この動作を制御する方法はありますか?具体的には、invalidate()
への呼び出しでこれらのオブジェクトにコレクションをマークしますか?彼らはいつそれらに保存された参照を解放するのですか?Java HttpSessionオブジェクトのライフサイクルは何ですか?
詳細がより詳細です。
明らかに、ある時点でオブジェクトが作成され、破棄され/プールに戻されます。私は特にこれらがどのようにガベージコレクションされているかに興味があります。この動作を制御する方法はありますか?具体的には、invalidate()
への呼び出しでこれらのオブジェクトにコレクションをマークしますか?彼らはいつそれらに保存された参照を解放するのですか?Java HttpSessionオブジェクトのライフサイクルは何ですか?
詳細がより詳細です。
HttpSession
は基本的に文字列キーから任意の値へのマップです。 (JSPにアクセスしたり、getSession()
/getSession(true)
を呼び出して)セッションを作成するたびに、コンテナは一意の文字列セッションIDを生成し、そのHttpSession
オブジェクトへの参照を保持します。再び、セッションIDからHttpSession
オブジェクトへのマップを使用します。
セッションに何かを入れたら、コンテナはそのセッションへの参照を保持し、セッションはオブジェクトへの参照を保持します。それはしばらくの間そこにとどまるでしょう。あなたの項目がセッションから削除されます3つの状況があります。
あなたは明示的に(removeAttribute()
またはsetAttribute(null)
)を削除すると
ときinvalidate()
セッション全体。これは基本的にすべての属性を削除し、コンテナ管理のセッションマップからセッション全体を削除します
セッションが期限切れになると(2と同じ動作)設定可能な時間内にセッションにアクセスしたサーブレット/分)
オブジェクトはセッション(上記のポイントのいずれか)から除去され、他のコードは、そのオブジェクトへの参照を保持していない、それは、ガベージコレクションの対象であり、次のGC実行中に除去される瞬間。
あなたは、上記の動作の一部を観察するためにのHttpSessionにHttpSessionBindingListenerをを実装するオブジェクトを追加することができます。このインタフェースを実装するオブジェクトは、セッションからアンバインドされているときにログメッセージを出力するなどのことができます。
documentation hereをチェックアウトすることができます。
これは、使用するコンテナ、実装の問題によって異なると思います。