显然,某个时候会创建一个对象并将其销毁/返回池中。我对这些垃圾收集方式特别感兴趣。有没有办法控制这种行为?具体来说,是否会调用invalidate()
标记这些对象以进行收集?他们什么时候发布存储在其中的任何参考文献?
越详细越好。
答案 0 :(得分:8)
HttpSession
基本上是从字符串键到某个任意值的映射。每次创建会话时(通过访问JSP或调用getSession()
/ getSession(true)
),容器都将生成唯一的字符串会话ID并保留对该HttpSession
对象的引用。同样,它将使用会话ID到HttpSession
对象的映射。
在会话中放入内容后,容器将保存对该会话的引用,并且会话保存对对象的引用。它会留在那里一段时间。您的商品将从会话中删除有三种情况:
明确删除时(removeAttribute()
或setAttribute(null)
)
当你invalidate()
整个会话时。这基本上删除了所有属性,并从容器管理的会话映射中删除整个会话
会话到期时(与2相同)当没有servlet / JSP在可配置的时间内(例如10分钟)访问会话时会发生这种情况
当一个对象从会话中移除(上述任何一点)并且没有其他代码保存对该对象的引用时,它就有资格进行垃圾收集,并将在下一次GC运行期间被删除。
您可以将实现 HttpSessionBindingListener 的对象添加到 HttpSession ,以观察上述某些行为。例如,实现此接口的对象可以在从会话中解除绑定时打印日志消息。
您可以查看documentation here。
答案 1 :(得分:1)
我认为这取决于您使用的容器,实施问题。