我知道session.invalidate()
发布了httpsession。但是当我监视容器内存时,它并没有降低。这是我观察的内容 -
最初我认为,垃圾收集可能只在达到低内存可用状态后才能工作。为了证实这一点,我使用-Xmx来减少内存。但仍然是同样的错误。事实上,当我使用单独的浏览器执行相同的活动时,我看到了OOM错误。
这里有什么遗漏吗?
答案 0 :(得分:1)
它将存在于内存中,直到垃圾收集器运行并找到未引用的对象并清除它们。您可以尝试在System.gc()
之后使用session.invalidate()
显式调用GC,仅用于测试目的。同时调用System.gc()
不需要调用GC,因为jvm将决定是否运行GC。
答案 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
检查班级直方图以查看Full GCs是否正在收集班级实例。比较Full GC之前/之后的实例数。启用:
-XX:+ PrintClassHistogramBeforeFullGC -XX:+ PrintClassHistogramAfterFullGC
再次拍摄直方图快照以查看是否正在收集课程:
jmap -histo $ pid
查看该类是否包含一个finalize()方法,该方法将阻止在GC期间收集该对象。
正如GargantuChet建议的那样,收集HeapDump并查看哪些对象引用了您的类实例。