Java Tomcat“OutOfMemoryError:Java堆空间”是由无尽的Sessions引起的?

时间:2013-12-17 21:37:53

标签: java spring tomcat memory memory-leaks

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

我最近开始遇到“OutOfMemoryError:Java堆空间”,让我的应用程序在嵌入式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
...

因此应用程序无休止地创建会话,并且探查器确认它:

Profiler classes Profiler instances

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

任何可能导致此行为的想法,或者提取更多信息的下一步(如果可能的话,创建会话的地方)都会受到大力赞赏,谢谢!

1 个答案:

答案 0 :(得分:4)

哇,我很蠢。我有一天在一个轻量级的javascript资源加载器上工作,但有两个明显的错误:

  1. 没有重试限制。
  2. 我忘记了加载的路径和文件名之间的“/”,因此它无休止地请求一个不存在的文件。
  3. 无论如何,加载程序充斥着服务器的请求,这只是通过检查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 -
    

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