【问题标题】:Does the session timeout parameter kill object or does the object remain in memory?会话超时参数是杀死对象还是对象保留在内存中?
【发布时间】:2014-08-28 04:45:58
【问题描述】:

在我的 java 项目 web.xml 中,会话超时参数设置为 5 分钟。 5 分钟后,所有会话对象都被杀死还是保留内存?

【问题讨论】:

  • 这比GC复杂一点。它与 servlet 容器的整个会话管理过程有关。我正在重新打开,因为那个副本并没有涵盖所有内容。
  • 正如@SotiriosDelimanolis 已经说过的那样,这有点复杂,因为我不是 servlet 容器方面的专家(并且不同的容器可能会选择不同的处理方式)我只能猜测:5 分钟后 不活动容器使会话无效,它可能也被从容器的会话存储中删除。如果没有其他对会话的引用阻止 GC,那么它可能被立即收集,如果垃圾收集器在那个时候运行。
  • setMaxInactiveInterval()的合约说会作废。问题是 IMO,如果 invalidate() 将使会话符合 GC 的条件,这是 IMO 的主要目的 invalidate()

标签: java session-cookies session-timeout


【解决方案1】:

我曾经有同样的问题,所以我检查了 tomcat 源代码。我没有检查所有内容,但我会尽可能多地检查。有一个StandardSession 类,其中有很多方法与此相关。

  • 其中之一是 expire(),它将 isValid 变量更新为 false。
  • 还有另一种方法 recycle() 清除所有属性并重置许多属性,例如 lastAccessedTimemaxInactiveInterval 等。

现在我假设会话超时时会调用这些方法。所以它不会杀死它们,而是回收它们。

我进入会话管理器ManagerBase 看看它是不是在做什么。每当新请求到来时,都会调用以下方法(在此之前很少有其他方法调用)。

/**
 * Get a session from the recycled ones or create a new empty one.
 * The PersistentManager manager does not need to create session data
 * because it reads it from the Store.
 */
@Override
public Session createEmptySession() {
    return (getNewSession());
}

【讨论】:

  • 我使用 java struts 框架和程序列出的数据和这个 arraylist set session.setAttribute("dataList" dataList) 例如。垃圾收集可能已满,服务器有时会停止。我说,也许 JVM 或 Weblogic 应用服务器仍然保留内存。我们有 300 个用户,他们列在此列表中。并且列表始终设置为会话。使用 session.removeAttribute("dataList") 删除会话。但在我看来,会话不能被杀死或删除?
  • removeAttribute 与终止会话无关。您只是从会话中删除该属性。服务器在某个时候停止是什么意思?
  • 服务器和服务器的 JVM 或 Weblogic 的 RAM 和 CPU 级别 %100 正在停止。但我修好了。会话超时设置为 5 分钟。现在我修复它。也许将来,我必须配置堆大小或其他什么..
猜你喜欢
  • 1970-01-01
  • 2011-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多