【发布时间】:2016-05-25 22:10:41
【问题描述】:
我的 Jetty webapp (9.3.6) 出现内存泄漏(java.lang.OutOfMemoryError: Java heap space 错误)。
版主的快速说明,这不是 PermGen 问题,似乎已经记录了解决方案。我尝试了一些 SO 搜索,但似乎没有在任何相关问题中询问这个问题。
它是一个 websocket 应用程序,我正在使用 JVisualVM 对其进行分析,我看到有大量的字符串被分配而永远不会被删除,我不知道如何或如何处理那个问题。另外,我看到org.eclipse.jetty.websocket.server.WebSocketServerFactory#1 和
org.eclipse.jetty.webapp.WebAppClassLoader#1 的规模稳步增长(迅速?)。为了解决这个问题(或者我认为),我阅读了 Jetty here 中的内存管理页面并将AppContextLeakPreventer 添加到我的${jetty.home}/etc/jetty.xml 中,这也无济于事(发现我重做堆转储)。
在 Jetty webapp 中处理不断增长的堆的正确方法是什么?目前,我是预生产,所以我没有热部署服务器。我还将堆大小增加到-Xmx256M(它是一个 1GB RAM AWS 实例,所以这里没有多少空间)。
我的客户端应用程序目前数量很少,我主要观察使用 JVisualVM 不断增长的内存配置文件。
感谢任何输入。任何关于准确找出导致这种情况的类的指针也值得赞赏。我目前从摘要/检查选项卡的“最大对象”部分的堆转储中获得了上述信息。
(编辑,02/15)
在意识到这可能是 Jetty 9.3.6 中的错误后,我添加了一些测试说明(请参阅http://dev.eclipse.org/mhonarc/lists/jetty-users/msg06666.html)。我想补充一点,我当前用于此分析工作的测试环境正在使用 shell 脚本快速连续地启动 Java 客户端会话(即,不描述生产环境,但这显然也是生产环境的一个问题) .只有三个 shell,但它们每隔 5 秒左右就会不断地向 websocket 服务器发送一个全新的客户端会话(但它们会在重新开始之前关闭连接)。
【问题讨论】:
-
看来我遇到了 Jetty 用户邮件列表中提出的这个问题:
http://dev.eclipse.org/mhonarc/lists/jetty-users/msg06530.html。该错误是针对 9.3.5 提出的,我使用的是 9.3.6,我想我必须检查修复程序是否存在。我可以确认 Session 对象和其他WebSocketServerFactory对象仍然存在,导致大量的堆使用。 -
好的,这确实是一个错误(请参阅 Joakim Erdfelt 在dev.eclipse.org/mhonarc/lists/jetty-users/msg06666.html 的消息)。问题是 Session 对象在 Jetty 9.3.6 中的 WebSockets 的 JSR2356 实现中没有正确清理,并且在我的应用程序(添加到 OP 的说明)中,问题很快变得非常糟糕。等待修复。
标签: java web-applications memory-leaks heap-memory jetty-9