显然,在某个时刻,一个对象被创建并被销毁/返回到池中。我对如何收集垃圾特别感兴趣。有什么办法可以控制这种行为吗?具体来说,调用 invalidate()
是否会将这些对象标记为要收集?他们什么时候释放存储在其中的任何引用?
越详细越好。
最佳答案
HttpSession
基本上是从字符串键到某个任意值的映射。每次创建 session (通过访问 JSP 或调用 getSession()
/getSession(true)
)时,容器将生成唯一的字符串 session ID 并保存对该 session ID 的引用HttpSession
对象。同样,它将使用从 session ID 到 HttpSession
对象的映射。
一旦您将某些内容放入 session 中,容器就会保存对该 session 的引用,而 session 会保存对您的对象的引用。它会在那里停留一段时间。在三种情况下,您的项目将从 session 中删除:
当您明确删除它时(
removeAttribute()
或setAttribute(null)
)当您
invalidate()
整个 session 时。这基本上删除了所有属性并从容器管理的 session 映射中删除了整个 session当 session 过期时(与 2 的行为相同)。当在可配置的时间内(例如 10 分钟)没有 servlet/JSP 访问 session 时会发生这种情况
当一个对象从 session 中删除(上述任何一点)并且没有其他代码持有对该对象的引用时,它就有资格进行垃圾收集,并将在下一次 GC 运行期间被删除。
您可以将实现HttpSessionBindingListener 的对象添加到HttpSession 以观察上述某些行为。例如,实现此接口(interface)的对象可以在与 session 解除绑定(bind)时打印日志消息。
您可以查看 documentation here .
关于java - Java HttpSession 对象的生命周期是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11456214/