netty4虚拟内存不断飙升内存泄露

news/2024/11/25 19:15:18/

目录

 

前言

解决方案一 编写脚本清空缓存

解决方案二  手动清空ByteBuf

总结

 


前言

公司的核心业务是由netty4处理的,存在虚拟内存不断飙升的问题。直接表现为netty服务运行几天后会自己宕机,持续观察线上情况,最后得出两个解决方案。

解决方案一 编写脚本清空缓存

好处是

  • 见效快,脚本有现成,只需要复制一份,执行以下就可以清空;
  • 通用性强,可以用来作为临时维护手段,适用多种情况;
  • 不需要改代码,尤其源代码看着就头大,想改也无从下手;
  • 比重启项目的方式好

坏处:

  • 治标不治本,本身并没有解决问题,只是绕过了问题;
  • 这种情况方式会影响netty正在处理的ByteBuf,会影响到业务;
#!/usr/bin/env bash#清理系统缓存
clearSystemCache(){echo ">>>>>>>>>>>>>>>>>>>>>>开始执行清除" $EVN "系统环境环境缓存<<<<<<<<<<<<<<<<<<<<<<<<<<<"#drop_caches的值可以是0-3之间的数字,代表不同的含义:
#0:不释放(系统默认值)
#1:释放页缓存
#2:释放dentries和inodes
#3:释放所有缓存#释放内存前先使用sync命令做同步,以保证文件系统的完整性,将所有未写的系统缓冲区写到磁盘中
#包含已修改的 i-node、已延迟的块 I/O 和读写映射文件。否则在释放缓存的过程中,可能会丢失未保存的文件。
echo ">>>>>>>>>>>>>>>>>>>>>>执行清理文件系统缓存和无用对象和它们占用的内存<<<<<<<<<<<<<<<<<<<<<<<<<<<"
sync#清理pagecache(页面缓存)
echo ">>>>>>>>>>>>>>>>>>>>>>执行清理pagecache(页面缓存)<<<<<<<<<<<<<<<<<<<<<<<<<<<"
echo 1 > /proc/sys/vm/drop_caches#清理dentries(目录缓存)和inodes
echo ">>>>>>>>>>>>>>>>>>>>>>执行清理dentries(目录缓存)和inodes<<<<<<<<<<<<<<<<<<<<<<<<<<<"
echo 2 > /proc/sys/vm/drop_caches#清理pagecache、dentries和inodes
echo ">>>>>>>>>>>>>>>>>>>>>>执行清理pagecache、dentries和inodes<<<<<<<<<<<<<<<<<<<<<<<<<<<"
echo 3 > /proc/sys/vm/drop_caches
}clearSystemCache

解决方案二  手动清空ByteBuf

参考如下链接:

  • https://www.cnblogs.com/chyu/p/5212528.html   (这个大佬提供一个解决思路)
  • https://zhuanlan.zhihu.com/p/84141912  (这个大佬讲了一下netty监控内存泄露机制的源码)

在研究了一番之后,我们得知ByteBuf是通过计数保持存活状态的,netty本身会自动回收。查看了源代码之后,发现ByteBuf只作用于编解码接口和几个接受数据的对象,然后我们就在对象内部进行手动释放。最后线上问题得到了解决。(警告:不要释放继承框架中的byteBuf,会导致通道失效!!!

ByteBuf byteBuf = Unpooled.buffer(9);
/**
业务处理
*/
byteBuf.release();

总结

作为一个贪婪的成年人,我全都要!在解决之前,查看了大佬们各种深入解决方案和内存排查手段。但是实际情况,内存泄露的情况并不是十分明显,所以有充足的时间进行测试。推荐大家可以利用htop监控,hcache查看缓存,使用arthas排查。

 

 


http://www.ppmy.cn/news/164015.html

相关文章

java 虚拟内存一直涨,win10虚拟内存文件大小突然暴涨是什么原因?震惊了!

以前win10的虚拟内存设置一般都是设置成让系统托管&#xff0c;从来没让****心过&#xff0c;一般页面文件也都是稳定在2个g左右 但就从这两天开始&#xff0c;突然c盘页面文件pagefile.sys开始诡异地激剧增长 试过把所有所有程序都关掉&#xff0c;就放在那里一动不动一整夜 第…

linux下delete释放不了内存,new了以后,马上delete,但是用prstat, pmap查看,内存不减少,为什么?...

new了以后,马上delete,但是用prstat, pmap查看,内存不减少,为什么? 1、 void f() {char * p = new char[1024 * 1024 * 4]; //用prstat,pmap查看,内存增加了4M sleep(5); delete [] p; //delete完以后,但是用prstat,pmap查看,内存没有减少 }…

MongoDB 如何使用内存?为什么内存满了?

最近接到多个MongoDB内存方面的线上case及社区问题咨询&#xff0c;主要集中在: 为什么我的 MongoDB 使用了 XX GB 内存&#xff1f;一个机器上部署多个 Mongod 实例/进程&#xff0c;WiredTiger cache 应该如何配置&#xff1f;MongoDB 是否应该使用 SWAP 空间来降低内存压力&…

linux内存一直在涨,linux下创建线程导致内存泄漏

用top发现virt的使用量一直在涨。于是可以断定有内存泄漏了&#xff0c;经过排查&#xff0c;最终确定原因出在多线程的问题上: 代码如下: pthread_t thread_id; int retpthread_create(&thread_id, NULL, flush_thread_work, (void*)&m_sql_client); if(ret!0){ APPSC…

C++内存管理及内存问题的分析

写服务端的&#xff0c;内存是一个绕不过的问题&#xff0c;而用C写的&#xff0c;这个问题就显得更严重。进程的内存持续上涨&#xff0c;有可能是正常的内存占用&#xff0c;也有可能是内存碎片&#xff0c;而C写的&#xff0c;还有可能是内存泄漏&#xff0c;那就需要一些方…

计算机内存就是指主板上,涨姿势:电脑内存用来干什么的?

今天讲的内存&#xff0c;可是很重要的东西&#xff01; 内存可是电脑硬件必不可少的配件&#xff0c;一般了解电脑的朋友都知道这个东西&#xff0c;如果你的电脑开不了机了&#xff0c;教你一个小技巧&#xff0c;有点装机常识的朋友可以插拨一下内存、或者用橡皮擦擦金手指&…

linux内存一直在涨,linux内存一直占满问题

Linux与Windows不同,会存在缓存内存,通常叫做Cache Memory。有些时候你会发现没有什么程序在运行,但是使用top或free命令看到可用内存会很少。 什么是Cache Memory(缓存内存): 当你读写文件的时候,Linux内核为了提高读写效率与速度,会将文件在内存中进行缓存,这部分内存…

linux c 多线程内存一直增长,为什么我的C程序的内存使用量会持续增长?

我是Linux和C的新手,对我的应用程序的内存使用情况有疑问. 我的应用程序处理大量实时数据,每秒约500条消息. 我使用std :: map来管理(即插入和擦除)所有消息.例如, std::map m_map; // when receive a new message, convert the message into a data structure m_map.insert(st…