6

显然,在某些时候,一个对象被创建并销毁/返回到池中。我对这些垃圾是如何收集的特别感兴趣。有没有办法控制这种行为?具体来说,是否会调用来invalidate()标记这些对象以供收集?他们何时释放存储在其中的任何引用?

越详细越好。

4

2 回答 2

9

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

一旦你在会话中放了一些东西,容器就会持有对该会话的引用,而会话会持有对你的对象的引用。它会在那里停留一段时间。您的项目将从会话中删除的三种情况:

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

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

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

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


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

您可以在此处查看文档

于 2012-07-12T16:48:30.067 回答
1

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

于 2012-07-12T16:25:22.903 回答