Tomcat websocket WsFrameServer内存溢出问题的解决方法

本文主要介绍了tomcat websocket WsFrameServer内存溢出的问题解决,文中通过图文示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。WebSocket连接上了

本文主要介绍了tomcat websocket WsFrameServer内存溢出的问题解决,文中通过图文示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

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

 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的包。

这里写图片描述

  • WsFrameServer继承WsFrameBase ,messageBufferText和messageBufferBinary属性就在WsFrameBase里,然后我们来debug程序,看看是怎么设置的值。

  • WsFrameServer里面会调用WsSession的构造方法有给messageBufferText和messageBufferBinary赋默认值2个都是8192大概是8K,然后再通过WsSession里面的get属性方法拿到这2个值。

这里写图片描述

这里写图片描述

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

这里写图片描述

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

这里写图片描述

这里写图片描述

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

这里写图片描述

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

到此这篇关于tomcat websocket WsFrameServer内存溢出的问题解决的文章就介绍到这了,更多相关tomcat websocket内存溢出内容请继续浏览下面的相关文章!

声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。文章及其配图仅供学习和交流之用,版权归原作者所有,如有内容侵权或者其他违规问题,请联系本站处理。