我为标题道歉,但我不太确定如何提出这个问题。
我最近开始遇到“OutOfMemoryError:Java heap space”,这是因为我的应用程序在嵌入式 tomcat 服务器中运行了很短的一段时间。
我什至不必查询服务器,我只需运行 mvn clean install tomcat7:run
并让服务器保持运行状态,几分钟后就会抛出 OutOfMemoryError。
我通过探查器 (VisualVM) 运行应用程序。服务器大约在“堆大小”第一次增加时启动并运行,“已用堆”在此之后一直增长,直到崩溃。
好吧,所以它闻起来像内存泄漏,但在我寻找答案的过程中,我遇到了 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 并且分析器确认了这一点:
但现在我卡住了。我已经尝试禁用应用程序的某些部分,这似乎是罪魁祸首,尽管应用程序中没有任何内容可以明确创建 session 。
对于可能导致此行为的任何想法,或提取更多信息的下一步(例如创建 session 的位置,如果可能),将不胜感激,谢谢!
最佳答案
哇,我傻了。我一直在研究一个轻量级的 javascript 资源加载器,但有两个明显的错误:
- 没有重试限制。
- 我忘记了正在加载的路径和文件名之间的“/”,所以它无休止地请求一个不存在的文件。
无论如何,加载程序正在向服务器发送大量请求,正如用户@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/