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

标签 java garbage-collection

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

越详细越好。

最佳答案

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

一旦您将某些内容放入 session 中,容器就会保存对该 session 的引用,而 session 会保存对您的对象的引用。它会在那里停留一段时间。在三种情况下,您的项目将从 session 中删除:

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

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

  3. 当 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/

相关文章:

java - 如何使用 Apache BEAM 在 BigQuery 中执行快速联接

java - 将文本文件行中的字符串标记输入数组,然后作为数组集合输出

java - 编写高效代码和优化内存

java - 可以在多个类方法中使用相同的 BasicDataSource、Connection、Statement 和 ResultSet 对象吗?

c# - 性能/风格 : Changing an object by reference vs returning a copy in C#

java - 如何使用 Java API 访问远程 HDFS 集群的配置 xml 文件?

java - 在jframe上添加webview引擎控制

java - 如何将 while 循环改为 for 循环

java - 在永无休止的任务上使用 ScheduledExecutorService 时如何执行垃圾收集?

JavaScript 内存管理陷阱?