Jetty webapp 继续增长到heap space: (OutOfMemoryError Java heap space)

Jetty webapp continues to grow into heap space: (OutOfMemoryError Java heap space)

我的 Jetty webapp (9.3.6) 内存泄漏(java.lang.OutOfMemoryError: Java heap space 错误)。

版主的快速说明,这不是 PermGen 问题,似乎有解决方案。我尝试了一些 SO 搜索,但在任何相关问题中似乎都没有问到这个问题。

这是一个 websocket 应用程序,我正在使用 JVisualVM 对其进行分析,我看到有大量的字符串被分配但从未被删除,我不知道如何或如何删除解决那个问题。此外,我看到 org.eclipse.jetty.websocket.server.WebSocketServerFactory#1org.eclipse.jetty.webapp.WebAppClassLoader#1 规模稳步(迅速?)增长。为了解决这个问题(或者我认为)我阅读了 Jetty here 中的内存管理页面并将 AppContextLeakPreventer 添加到我的 ${jetty.home}/etc/jetty.xml 并且这也没有帮助(发现我重做我的堆转储)。

处理 Jetty 网络应用程序中不断增长的堆的正确方法是什么?目前,我是预生产阶段,所以我不会热部署服务器。我还将堆大小增加到 -Xmx256M(它是一个 1GB RAM AWS 实例,所以这里没有多少活动空间)。

目前我的客户端应用程序数量很少,我主要观察使用 JVisualVM 不断增长的内存配置文件。

欢迎任何意见。任何关于弄清楚 类 到底是什么导致了这种情况的指示也很受欢迎。我目前从 summary/inspect 选项卡的 "Biggest objects" 部分的堆转储中获得了上述信息。

(编辑,02/15)

在意识到这可能是 Jetty 9.3.6 中的错误后,我添加了一些测试说明(参见 http://dev.eclipse.org/mhonarc/lists/jetty-users/msg06666.html)。我想补充一点,我当前用于此分析工作的测试环境正在使用 shell 脚本快速连续启动 Java 客户端会话(即,不描述生产环境,但这显然生产环境也是一个问题)。只有三个 shells,但他们每隔 5 秒左右就会连续不断地向 websocket 服务器发射一个全新的客户端会话(但他们会在再次执行之前关闭连接)。

我确认转移到 Jetty 9.3.7 解决了这个问题;我相信我遇到的堆 space 问题与 here 中描述的错误(和修复)有关。

具体来说,Jetty 9.3.6(可能还有 Jetty 9.3.5)存在一个错误,它没有正确清理 Jetty 服务器上的 JSR356(客户端)会话对象,导致内存不足客户端经常重新连接(或客户端太多)的应用程序泄漏。

希望这对某人有所帮助。