[英]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监视器的样子:
没有更多细节很难确定,但这可能与您的会话保留有关。 我认为正在发生的是, 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.