【问题标题】:Jetty webapp continues to grow into heap space: (OutOfMemoryError Java heap space)Jetty webapp 继续增长到堆空间:(OutOfMemoryError Java 堆空间)
【发布时间】: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#1org.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


【解决方案1】:

我确认迁移到 Jetty 9.3.7 消除了这个问题;我相信我面临的堆空间问题与here 中描述的错误(和修复)有关。

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

希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多