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

在使我的应用程序在嵌入式tomcat服务器中运行很短时间后,我最近开始遇到“OutOfMemoryError:Java堆空间”。

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

我通过分析器(VisualVM)运行了该应用程序。服务器在大约“堆大小”的第一次增加附近启动并运行,在此之后直到“崩溃”之前,“已用堆”一直在增长。

好的,所以闻起来像是内存泄漏,但是在寻找答案的过程中,我碰到了this similar question,这建议添加一个SessionListener as per this example。我添加了此类和listener标签,运行了服务器,事情变得很有趣。服务器启动后,日志立即被淹没:

...
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
...

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


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

非常感谢任何可能导致此行为的想法,或下一步提取更多信息(例如在可能的地方创建会话)的所有想法,谢谢!

最佳答案

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

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

  • 无论如何,加载程序都用请求充斥服务器,这只能通过检查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 -
    

    因此,基本上,我给家人蒙上了极大的耻辱。感谢所有提出建议的人!

    10-05 17:43