Java Tomcat "OutOfMemoryError: Java heap space"由无休止的 session 引起?

标签 java spring tomcat memory memory-leaks

我为标题道歉,但我不太确定如何提出这个问题。

我最近开始遇到“OutOfMemoryError:Java heap space”,这是因为我的应用程序在嵌入式 tomcat 服务器中运行了很短的一段时间。

我什至不必查询服务器,我只需运行 mvn clean install tomcat7:run 并让服务器保持运行状态,几分钟后就会抛出 OutOfMemoryError。

我通过探查器 (VisualVM) 运行应用程序。服务器大约在“堆大小”第一次增加时启动并运行,“已用堆”在此之后一直增长,直到崩溃。

Profiler graph

好吧,所以它闻起来像内存泄漏,但在我寻找答案的过程中,我遇到了 this similar question这建议添加一个 SessionListener as 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 并且分析器确认了这一点:

Profiler classes Profiler instances

但现在我卡住了。我已经尝试禁用应用程序的某些部分,这似乎是罪魁祸首,尽管应用程序中没有任何内容可以明确创建 session 。

对于可能导致此行为的任何想法,或提取更多信息的下一步(例如创建 session 的位置,如果可能),将不胜感激,谢谢!

最佳答案

哇,我傻了。我一直在研究一个轻量级的 javascript 资源加载器,但有两个明显的错误:

  1. 没有重试限制。
  2. 我忘记了正在加载的路径和文件名之间的“/”,所以它无休止地请求一个不存在的文件。

无论如何,加载程序正在向服务器发送大量请求,正如用户@dimoniy 所建议的那样,只有通过检查 tomcat 访问日志才能发现这一点,这揭示了恐怖之处:

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 -

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

关于Java Tomcat "OutOfMemoryError: Java heap space"由无休止的 session 引起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20645207/

相关文章:

tomcat - 如何使用 Apache tomcat 设置 fastCGI 以运行 C++?

java - 创建供应商中立的 EJB3 客户端

jsp - session 过期后自动重新登录

tomcat - 如何确定上传连接是否安全 (ssl)?

java - 方面是否替代存储库?

java - Spring Neo4j 事务回滚不起作用

Spring嵌套事务

java - 列表更新后 onItemClick 停止工作

java - 使 java applet 符合高安全标准

java - 屏幕关闭时的Android应用程序视频录制