很抱歉标题不太清楚,但我不确定该如何询问。
最近在嵌入式Tomcat服务器中运行我的应用程序时,不久后出现了“OutOfMemoryError: Java heap space”。
我甚至不必查询服务器,只需运行mvn clean install tomcat7:run
并让服务器运行一段时间,就会抛出OutOfMemoryError。
我用分析器(VisualVM)运行了应用程序。服务器大约在“堆大小”第一次增加时就启动并运行,此后,“已使用的堆”保持增长,直到崩溃。
好吧,看起来像内存泄漏,但在寻找答案时,我遇到了这个类似的问题,建议添加一个SessionListener
按照此示例。我添加了这个类和监听器标记,运行服务器,然后事情变得有趣起来。服务器启动后立即,日志被淹没:
...
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
...
所以应用程序不断创建会话,分析器证实了这一点:
![Profiler classes](https://istack.dev59.com/E2BcU.webp) ![Profiler instances](https://istack.dev59.com/5Nzqh.webp)
但现在我陷入了困境。我尝试禁用似乎有问题的应用程序部分,尽管应用程序中没有明确创建会话的内容。
请问有什么想法可以解决这种行为,或者提取更多信息的下一步(例如,如果可能的话,会话是在哪里创建的)?非常感谢!
http-bio
,因此它是HTTP连接工作线程。它创建HTTP连接会话... 检查HTTP流量,检查请求、远程地址、用户代理等... 或使用Wireshark进行嗅探或使用RequestDumperValve。 - Pavel Horal