首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在部署了WebSocket应用程序后,Tomcat逐渐耗尽内存

在部署了WebSocket应用程序后,Tomcat逐渐耗尽内存
EN

Stack Overflow用户
提问于 2017-07-22 00:17:00
回答 3查看 2.5K关注 0票数 20

我让Tomcat8.5.9运行在一个亚马逊网络服务机器上,上面部署了10个不同的WebSocket应用程序,每个应用程序基本上都充当消息代理。https连接器正在使用Http11NioProtocol。我设置的唯一参数是maxThreads=200和证书信息。

请求量不是很大。它从周一早上开始运行,经理状态是这样显示的:

最大线程数: 200

当前线程数: 38

当前线程正忙:0

保持活动套接字计数:1

最大处理时间:234ms

处理时间: 17.254秒

请求数: 33351

错误计数: 325

接收的字节数: 0.00 MB

发送字节数: 34.07 MB

几天后,我注意到内存使用量继续增长。我必须大约每两周重启一次Tomcat服务,以防止出现OutOfMemoryException。

我一直在使用Eclipse MAT进行堆转储和分析,它总是指出WsFrameServer类是问题的可疑之处。最新的转储显示以下内容:

"org.apache.tomcat.websocket.server.WsFrameServer",的

5,146个实例

由"java.net.URLClassLoader @ 0x6c0047c28“加载占用1383,143,200

(73.13%)字节。这些实例是从

"java.util.concurrent.ConcurrentHashMap$Node[]“

Dominator树目前有106,000个条目,其中大部分是WsFrameServer类。

是我做错了什么,还是这是“正常”的?在Tomcat或Connector上是否有我应该设置的特定设置,以防止这种情况发生?

提前谢谢。

编辑:我不确定这是否有帮助,但这是VisualVM监视器的样子:

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-07-31 14:18:15

如果没有更多细节,很难确定,但这可能与您的会话保留有关。我认为正在发生的事情是扩展WsFrameBase is added into the session.WsFrameServer

如果您有一个无限制的会话保留策略,那么您最终将耗尽内存。

尝试设置非0 sessionTimeout

票数 5
EN

Stack Overflow用户

发布于 2017-08-04 20:19:28

您的问题中缺少代码。(特别是如何管理websocket连接)

你有没有在异步模式下使用tomcat和某个地方的连接列表?

您没有忘记将close和error事件绑定到从列表中删除错误连接的代码吗?

票数 0
EN

Stack Overflow用户

发布于 2017-08-05 09:57:49

众所周知,Java GC是懒惰的。它的内存将继续增长,直到它不能再有更多的内存,然后GC将被触发来收集垃圾。

从你的VisualVM截图中,我们可以看到内存使用是相对正常的:随着时间的推移,内存使用量增加,GC后内存使用量下降。

所以我想知道你的应用是否真的会因为OOM而崩溃。您可以在您的测试环境中尝试它,并让OOM JVM转储进行分析,这更有用。

顺便说一下,我建议使用VisualVM而不是MAT,因为MAT将包含一些unreachable对象作为GC根。它将使内存分析非常低效,并给出与我在我们的一个项目中遇到的其他工具不同的结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45242357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档