前段时间一直遇到websocket的内存溢出问题,最后在排除了代码的问题之后,开始查找了框架的问题,最后找到了两个框架会影响到的坑,mark一下,顺便分享给大家
首先说项目:springboot的内置tomcat启动,用的websocket是tomcat内核,spring封装。
现象:启动项目后使用的时候cpu使用率不断增加达到99%,最后长时间运行由于CPU过高,导致无法访问最后报出OOM。使用jstat可以查看到由于新生代不断增长导致频繁gc使cpu使用率过高。
但究其原因是什么?
1.websocket设置
首先是网上查资料,找到一篇这样的帖子,点击这里。这是tomcat的一个设置
文章图片
默认tomcat为8*1024KB,为了使客户端和服务器传输的信息更大,所以会进行调整,但是tomcat里面的设置是每次通讯都会 new一个上面设置的大小的buffer。这样会增加内存的使用量,所以大小一定要和客户端的同学沟通,不要设置过大。将这个问题改完后比较明显,不会频繁gc。但是在查看jstat时候仍然发现新生代在不断升高。所以不是主要原因
【websocket影响内存泄漏的两个点】2.tomcat版本
后面我们注释掉了所有逻辑,发现只要启动了websocket,哪怕没有任何连接新生代仍在增长。在最后寻找原因后,终于找到了tomcat版本的问题,由于过去使用的是springmvc,我们使用tomcat9.0.0.M1,所以在springboot上我们升级了springboot默认的版本到tomcat9.0.0.M1。最后我们更改了版本,改回了springboot默认的版本8.5.23。然后....奇迹出现了,cpu正常了....目前还没有查看源码,不过这个坑是找到了,提示各位,springboot推荐的版本还是很稳定的,没有必要的话使用默认版本即可~
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)