Java Tomcat“OutOfMemoryError: Java heap space”由无休止的会话引起吗?

4

很抱歉标题不太清楚,但我不确定该如何询问。

最近在嵌入式Tomcat服务器中运行我的应用程序时,不久后出现了“OutOfMemoryError: Java heap space”。

我甚至不必查询服务器,只需运行mvn clean install tomcat7:run并让服务器运行一段时间,就会抛出OutOfMemoryError。

我用分析器(VisualVM)运行了应用程序。服务器大约在“堆大小”第一次增加时就启动并运行,此后,“已使用的堆”保持增长,直到崩溃。

Profiler graph

好吧,看起来像内存泄漏,但在寻找答案时,我遇到了这个类似的问题,建议添加一个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)
但现在我陷入了困境。我尝试禁用似乎有问题的应用程序部分,尽管应用程序中没有明确创建会话的内容。
请问有什么想法可以解决这种行为,或者提取更多信息的下一步(例如,如果可能的话,会话是在哪里创建的)?非常感谢!

2
你能描述一下你的应用程序实际上是做什么的,以及它获得了哪种类型的流量(如果有的话)吗? - eis
3
启用并检查您的访问日志。看起来您确实会得到某种类型的流量,因为会话通常不会随机创建。 - dimoniy
2
你的应用程序中没有记录会话.getSession()的日志吗(例如获取用于记录的唯一ID)? - DaveH
2
线程是http-bio,因此它是HTTP连接工作线程。它创建HTTP连接会话... 检查HTTP流量,检查请求、远程地址、用户代理等... 或使用Wireshark进行嗅探或使用RequestDumperValve。 - Pavel Horal
2
这个问题似乎不适合讨论,因为它涉及一些 JavaScript 请求。过于局限性。 - madth3
显示剩余13条评论
1个回答

4

哇,我真笨。我一直在写一个轻量级的JavaScript资源加载器,但是发现了两个明显的问题:

  1. 没有重试限制。
  2. 我忘记在路径和文件名之间加上“/”,导致它不停地请求一个不存在的文件。

无论如何,这个加载器正在向服务器发送大量请求,这只有通过检查Tomcat访问日志才能发现(由用户@dimoniy建议),揭露了恐怖的事实:

127.0.0.1 - - [17/Dec/2013:17:39:34 -0500] "GET /myapp/ajax/loadjquery.js HTTP/1.1" 302 -
127.0.0.1 - - [17/Dec/2013:17:39:35 -0500] "GET /myapp/ajax/loadjquery.js HTTP/1.1" 302 -
127.0.0.1 - - [17/Dec/2013:17:39:37 -0500] "GET /myapp/ajax/loadjquery.js HTTP/1.1" 302 -
127.0.0.1 - - [17/Dec/2013:17:39:39 -0500] "GET /myapp/ajax/loadjquery.js HTTP/1.1" 302 -

所以,基本上我给我的家人带来了巨大的羞耻。感谢所有提供建议的人!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接