Java HttpSession对象的生命周期是什么?

时间:2012-07-12 16:19:26

标签: java garbage-collection

显然,某个时候会创建一个对象并将其销毁/返回池中。我对这些垃圾收集方式特别感兴趣。有没有办法控制这种行为?具体来说,是否会调用invalidate()标记这些对象以进行收集?他们什么时候发布存储在其中的任何参考文献?

越详细越好。

2 个答案:

答案 0 :(得分:8)

HttpSession基本上是从字符串键到某个任意值的映射。每次创建会话时(通过访问JSP或调用getSession() / getSession(true)),容器都将生成唯一的字符串会话ID并保留对该HttpSession对象的引用。同样,它将使用会话ID到HttpSession对象的映射。

在会话中放入内容后,容器将保存对该会话的引用,并且会话保存对对象的引用。它会留在那里一段时间。您的商品将从会话中删除有三种情况:

  1. 明确删除时(removeAttribute()setAttribute(null)

  2. 当你invalidate()整个会话时。这基本上删除了所有属性,并从容器管理的会话映射中删除整个会话

  3. 会话到期时(与2相同)当没有servlet / JSP在可配置的时间内(例如10分钟)访问会话时会发生这种情况

  4. 当一个对象从会话中移除(上述任何一点)并且没有其他代码保存对该对象的引用时,它就有资格进行垃圾收集,并将在下一次GC运行期间被删除。


    您可以将实现 HttpSessionBindingListener 的对象添加到 HttpSession ,以观察上述某些行为。例如,实现此接口的对象可以在从会话中解除绑定时打印日志消息。

    您可以查看documentation here

答案 1 :(得分:1)

我认为这取决于您使用的容器,实施问题。