【发布时间】:2014-01-05 20:49:24
【问题描述】:
我为标题道歉,但我不太清楚如何问这个问题。
我的应用在嵌入式 tomcat 服务器中运行了很短的时间后,最近开始遇到“OutOfMemoryError: Java heap space”。
我什至不必查询服务器,我只需运行 mvn clean install tomcat7:run 并让服务器保持运行状态,几分钟后就会抛出 OutOfMemoryError。
我通过分析器 (VisualVM) 运行应用程序。服务器大约在“堆大小”的第一次增加时启动并运行,“已用堆”在此之后一直在增长,直到崩溃。
好的,所以它闻起来像内存泄漏,但在我搜索答案的过程中,我遇到了this similar question,它建议添加一个SessionListeneras per this example。我添加了这个类和监听器标签,运行了服务器,事情变得有趣了。服务器启动后,日志立即被淹没:
...
21:57:41.346 [http-bio-8080-exec-2] DEBUG c.f.p.system.LoggingSessionListener[34] - Session created: B9AC20CB3912D39D1AF8CEBC7D7F7ADD
21:57:41.346 [http-bio-8080-exec-2] DEBUG c.f.p.system.LoggingSessionListener[35] - Total sessions: 148
21:57:41.352 [http-bio-8080-exec-2] DEBUG c.f.p.system.LoggingSessionListener[34] - Session created: 1A4A4EB69585E99FAE3852D3AD9D4D22
21:57:41.353 [http-bio-8080-exec-2] DEBUG c.f.p.system.LoggingSessionListener[35] - Total sessions: 149
21:57:41.359 [http-bio-8080-exec-2] DEBUG c.f.p.system.LoggingSessionListener[34] - Session created: C48EE6DF9B0E3111AD38EAE864791C0C
21:57:41.359 [http-bio-8080-exec-2] DEBUG c.f.p.system.LoggingSessionListener[35] - Total sessions: 150
21:57:41.365 [http-bio-8080-exec-6] DEBUG c.f.p.system.LoggingSessionListener[34] - Session created: D7384A391FBA06BE049AB4970EDB3E1E
21:57:41.365 [http-bio-8080-exec-6] DEBUG c.f.p.system.LoggingSessionListener[35] - Total sessions: 151
21:57:41.370 [http-bio-8080-exec-6] DEBUG c.f.p.system.LoggingSessionListener[34] - Session created: F153AE5CC427EA1E1D67FA934E54D7AB
21:57:41.370 [http-bio-8080-exec-6] DEBUG c.f.p.system.LoggingSessionListener[35] - Total sessions: 152
21:57:41.375 [http-bio-8080-exec-6] DEBUG c.f.p.system.LoggingSessionListener[34] - Session created: 70F1714A1010DE2AC1DAE37B191288B0
21:57:41.376 [http-bio-8080-exec-6] DEBUG c.f.p.system.LoggingSessionListener[35] - Total sessions: 153
21:57:41.381 [http-bio-8080-exec-6] DEBUG c.f.p.system.LoggingSessionListener[34] - Session created: F4C69A8E9A41CFDD59DB211BC431A409
21:57:41.381 [http-bio-8080-exec-6] DEBUG c.f.p.system.LoggingSessionListener[35] - Total sessions: 154
...
所以应用程序会无休止地创建会话并且分析器确认它:
但现在我被困住了。我已尝试禁用应用程序中似乎可能是罪魁祸首的部分,尽管应用程序中没有明确创建会话的任何内容。
任何关于可能导致此行为的想法,或提取更多信息的下一步(例如在哪里创建会话,如果可能),将不胜感激,谢谢!
【问题讨论】:
-
你能描述一下你的应用实际做了什么,它获得了什么样的流量(如果有的话)?
-
启用并检查您的访问日志。看起来您确实获得了某种流量,因为会话通常不会随机创建
-
您的应用程序中没有任何日志记录可以执行 session.getSession() 操作(例如,获取用于记录的唯一 ID)?
-
线程是
http-bio,所以它是HTTP连接工作者。它是创建会话的 HTTP 连接...检查 HTTP 流量、检查请求、远程地址、用户代理...或使用 Wireshark 嗅探或使用 RequestDumperValve。 -
这个问题似乎是题外话,因为原因是一些 javascript 请求。过于本地化。
标签: java spring tomcat memory memory-leaks