从Java Web应用程序的内存中清除无效会话的简便方法

时间:2012-12-06 16:37:12

标签: java session servlets garbage-collection httpsession

我知道session.invalidate()发布了httpsession。但是当我监视容器内存时,它并没有降低。这是我观察的内容 -

  • 登录(我的应用程序创建会话)
  • 用户执行一些可增加进程内存的活动。
  • 注销。 (注销控制器显式使会话无效)
  • 监控进程内存。它永远不会失效。

最初我认为,垃圾收集可能只在达到低内存可用状态后才能工作。为了证实这一点,我使用-Xmx来减少内存。但仍然是同样的错误。事实上,当我使用单独的浏览器执行相同的活动时,我看到了OOM错误。

这里有什么遗漏吗?

2 个答案:

答案 0 :(得分:1)

它将存在于内存中,直到垃圾收集器运行并找到未引用的对象并清除它们。您可以尝试在System.gc()之后使用session.invalidate()显式调用GC,仅用于测试目的。同时调用System.gc()不需要调用GC,因为jvm将决定是否运行GC。

答案 1 :(得分:1)

您可以尝试以下方法之一来分析问题:

  1. 打印GC日志,查看是否以及有多少Young / Full GC集合出现:

      

    -XX:+ UnlockDiagnosticVMOptions -XX:+ LogVMOutput -XX:LogFile = jvm.log -XX:+ HeapDumpOnOutOfMemoryError -Xloggc:bin / gc.log -XX:+ PrintGCTimeStamps -XX:+ PrintGCDetails -verbose:gc

  2. 检查班级直方图以查看Full GCs是否正在收集班级实例。比较Full GC之前/之后的实例数。启用:

      

    -XX:+ PrintClassHistogramBeforeFullGC -XX:+ PrintClassHistogramAfterFullGC

  3. 再次拍摄直方图快照以查看是否正在收集课程:

      

    jmap -histo $ pid

  4. 查看该类是否包含一个finalize()方法,该方法将阻止在GC期间收集该对象。

  5. 正如GargantuChet建议的那样,收集HeapDump并查看哪些对象引用了您的类实例。