繁体   English   中英

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

[英]Tomcat gradually running out of memory with WebSocket apps deployed

我在一个AWS盒子上运行Tomcat 8.5.9,部署了10个不同的WebSocket应用程序,每个应用程序基本上都充当了消息代理。 https连接器正在使用Http11NioProtocol。 我设置的唯一参数是maxThreads = 200以及证书信息。

请求量不是很高。 它从周一早上开始运行,这是经理状态所说的:

最大线程数:200
当前线程数:38
当前线程忙:0
保持活插座数:1
最长处理时间:234毫秒
处理时间:17.254秒
申请人数:33351
错误数:325
收到的字节数:0.00 MB
发送的字节数:34.07 MB

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

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

5,146个“org.apache.tomcat.websocket.server.WsFrameServer”实例,
由“java.net.URLClassLoader @ 0x6c0047c28”加载占用1,383,143,200
(73.13%)字节。 这些实例是从一个实例引用的
“java.util.concurrent.ConcurrentHashMap中的$节点[]”

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

我做错了什么还是这个“正常”? Tomcat或连接器上是否有任何特定设置我应该设置以防止这种情况发生?

提前致谢。

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

VisualVM监视器

没有更多细节很难确定,但这可能与您的会话保留有关。 我认为正在发生的是, WsFrameServer延伸WsFrameBase 被添加到会话中。
如果您拥有无限制的会话保留策略,那么您最终将耗尽内存。

尝试设置非0 sessionTimeout

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

您是否在异步模式下使用tomcat和某个连接列表?

您不要忘记将关闭AND错误事件绑定到从列表中删除错误连接的代码?

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

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

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

顺便说一句,我建议VisualVM over MAT,因为MAT将包含一些无法访问的对象作为GC根。 它将使内存分析效率非常低,并且与我在其中一个项目中遇到的其他工具一样给出不同的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM