Tomcat
主页 > 服务器 > Tomcat >

tomcat websocket WsFrameServer内存溢出的问题解决

2024-12-25 | 佚名 | 点击:

WebSocket连接上了300以后JVM就报内存溢出了,把JVM溢出的堆栈日志导了出来这是详情:

1

2

3

4

5

6

648 instances of "org.apache.tomcat.websocket.server.WsFrameServer", loaded by "java.net.URLClassLoader @ 0x80f923a8" occupy 1,598,429,376 (96.40%) bytes. These instances are referenced from one instance of "java.util.concurrent.ConcurrentHashMap$Node[]", loaded by "<system class loader>"

 

Keywords

java.util.concurrent.ConcurrentHashMap$Node[]

org.apache.tomcat.websocket.server.WsFrameServer

java.net.URLClassLoader @ 0x80f923a8

这里写图片描述

这里写图片描述

这里写图片描述

可以看到WsFrameServer里面有2个变量messageBufferText和messageBufferBinary占用内存比较大。那么来看下源码,一般项目不会导入tomcat的jar,所以如果在项目里找不到WsFrameServer就先导入tomcat的包。

这里写图片描述

这里写图片描述

这里写图片描述

然后走到了WsWebSocketContainer , setDefaultMaxTextMessageBufferSize方法设置值,这里的值是819200大概是800K

这里写图片描述

然后再走看是哪里调用的这个方法:

这里写图片描述

这里写图片描述

设置messageBufferText和messageBufferBinary的地方就是ServletServerContainerFactoryBean,最后发现在spring的配置文件中配置了这2个值:

这里写图片描述

把这个后面2个属性的值减少2个0,连接数明显增大了,也没报内存溢出了。

原文链接:
相关文章
最新更新