6

明らかに、ある時点でオブジェクトが作成され、破棄/プールに戻されます。これらがどのようにガベージコレクションされるかに特に興味があります。この動作を制御する方法はありますか?具体的には、invalidate()これらのオブジェクトを収集対象としてマークするための呼び出しはありますか?保存されている参照はいつリリースされますか?

詳細が多いほど良いです。

4

2 に答える 2

9

HttpSession基本的に、文字列キーから任意の値へのマップです。getSession()(JSP にアクセスするか/を呼び出して) セッションを作成するたびgetSession(true)に、コンテナは一意の文字列セッション ID を生成し、そのHttpSessionオブジェクトへの参照を保持します。ここでも、セッション ID からHttpSessionオブジェクトへのマップが使用されます。

セッションに何かを入れると、コンテナはそのセッションへの参照を保持し、セッションはオブジェクトへの参照を保持します。しばらくそこにとどまります。アイテムがセッションから削除される状況は 3 つあります。

  1. 明示的に削除する場合 (removeAttribute()またはsetAttribute(null))

  2. invalidate()セッション全体を行う場合。これにより、基本的にすべての属性が削除され、コンテナ管理のセッション マップからセッション全体が削除されます

  3. セッションの有効期限が切れたとき (2 と同じ動作) これは、構成可能な時間 (たとえば 10 分) 内にサーブレット/JSP がセッションにアクセスしなかった場合に発生します。

オブジェクトがセッションから削除され (上記のポイントのいずれか)、他のコードがそのオブジェクトへの参照を保持していない場合、そのオブジェクトはガベージ コレクションの対象となり、次の GC 実行時に削除されます。


HttpSessionBindingListenerを実装するオブジェクトを HttpSession に追加して、上記の動作の一部を観察できます。このインターフェイスを実装するオブジェクトは、たとえば、セッションからバインド解除されたときにログ メッセージを出力できます。

ドキュメントはこちらで確認できます。

于 2012-07-12T16:48:30.067 に答える
1

これは、使用するコンテナ、実装の問題に依存すると思います。

于 2012-07-12T16:25:22.903 に答える