解决UDT中内存下不去的问题

使用UDT库,编写简单的网络通信程序,发现了一个问题,关闭一部分连接后,程序占用内存并没有变化。

比如先连接500个,再连接另500个,先关掉后面500个,程序占用内存降一半,再关掉500个,程序占用内存降到0.1。然而,如果先关掉前面500个,程序占用内存不会发生变化,只有等再关掉后面500个,程序内存才会降到0.1。

换个顺序就降不了,这很奇怪,很“玄学”。

跟踪代码至底层,该有的释放都有,这是为什么?灵机一动想到可能与linux内存管理机制有关,果不其然,linux中给程序分配堆内存后,当程序free,内存并不会马上还给系统,而是交由Ptmalloc管辖,这样程序再需要内存的时候,就可以直接向Ptmalloc取,不用再向系统申请,效率较高。Ptmalloc也不是说就不把内存还给系统了,返回内存的机制叫“内存收缩”,当堆顶的空闲内存大于收缩阈值(默认是128KB)时,即可触发。注意,这边要求的空闲内存必须位于堆顶,所以如果堆顶的内存不释放,堆底的内存再怎么释放都触发不了内存收缩,这就导致了那个玄学的结果。

因此,在代码里添加这么一句mallopt(M_MMAP_THRESHOLD, 128);,M_MMAP_THRESHOLD是mmap分配阈值,当程序所要内存大于M_MMAP_THRESHOLD时,直接调用mmap()分配内存,free的时候,会直接调用munmap()将内存还给操作系统,不再被Ptmalloc缓存管理。所以连接关闭后,内存就能下去了。

这样做的缺点是需要的内存更多,需要的内存数量随M_MMAP_THRESHOLD数值的减少而增多,所以需要选个合适的数字。且这些内存不再重用,分配效率也会比较低。

然而,对于分配长生命周期的大内存块,使用mmap()才是最高效的,Ptmalloc并不擅长管理长生命周期的内存,尤其是持续不定期分配和释放长生命周期的内存,这会导致内存暴增。

时间: 2024-08-30 01:30:04

解决UDT中内存下不去的问题的相关文章

解决 IDEA 中src下xml等资源文件无法读取的问题

该问题的实质是,idea对classpath的规定. 在eclipse中,把资源文件放在src文件夹下,是可以找到的: 但是在idea中,直接把资源文件放在src文件夹下,如果不进行设置,是不能被找到的. 下面说说几种解决方法,网上说的都很混乱,我这里做一个总结:推荐方法4 1.将所有资源文件放在resources文件夹下 这样做很方便,比较容易想到,但是层次性就很差了,比如mybatis的映射配置文件mapper.xml,本来需要放在特定的包里面,与dao层,service层等层次为同一个层级

解决MWPhotoBrowser中的SDWebImage加载大图导致的内存警告问题

解决MWPhotoBrowser中的SDWebImage加载大图导致的内存警告问题 iOS开发 · 2015-01-22 11:31 MWPhotoBrowser是一个非常不错的照片浏览器,在github的star接近3000个,地址:https://github.com/mwaterfall/MWPhotoBrowser.git MWPhotoBrowser来加载小图1M以下的都应该不会有内存警告的问题.如果遇到大图,3M.4M.5M的大图,很有可能导致内存警告.最近我就遇到这个问题,很是头疼

linux下开发,解决cocos2d-x中编译出现的一个小问题, undefined reference to symbol '[email protected]@GLIBC_2.2.5'

解决cocos2d-x中编译出现的一个小问题 对于cocos2d-x 2.×中编译中,若头文件里引入了#include "cocos-ext.h",在进行C++编译的时候会遇到例如以下错误: undefined reference to symbol '[email protected]@GLIBC_2.2.5'/lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command li

辛星跟您彻底解决CSS中的浮动(下)

上面一篇博文,我们讲解了如何使用CSS中的浮动,这一篇我们来讲解一下如何清除CSS中的浮动,其实CSS中的浮动的清楚很简单,只需要使用clear属性就可以了,至于怎么用好它,很多人可能一投雾水,我在初学的时候也是经常找不着北,就好像清除浮动是个随机事件一样,当然,它不是,它的规律性很强,就让辛星来给您剖析一下这个规律把. 首先还是上面的HTML文件,它的内容如下: <html> <head> <link rel="stylesheet" type=&quo

解决SecureCRT的vim中为下划线而无高亮问题,附最佳护眼配色方案

今天第一天上班,发现新公司也是用的最熟悉的SecureCRT终端.领到自己的办公电脑后,第一件事就是下载并安装了SecureCRT 7.1.并设置了以前最喜欢的配色(下文会有介绍). 公司的web软件用的是rensin,以前还真没怎么接触过,仔细拜读了前辈写的超级精简的一套部署教程,发现完全可以写一个懒人脚本一键搞定,于是动手写脚本,顺便进一步熟悉下resin. 写了一半发现以前熟悉的vim高亮没有了,全是下划线,写起来觉得不带劲,于是度了下娘,发现非常简单的解决办法: SecureCRT下的v

解决like中无法匹配下划线的问题

想要查询某字段含有下划线的记录,发现以下sql语句条件是无效的,会查询出表中所有的记录. select * from t_members t where t.c_memberid like '%_%' 原因:在like语句中的下划线的含义是“任意一个字符”,类似“%”代表匹配任意多个字符的. 正确的写法应该是:select * from t_members t where t.c_memberid like '%\_%' escape '\'

Linux中内存管理

转载自:http://blog.chinaunix.net/uid-26611383-id-3761754.html 前一段时间看了<深入理解Linux内核>对其中的内存管理部分花了不少时间,但是还是有很多问题不是很清楚,最近又花了一些时间复习了一下,在这里记录下自己的理解和对Linux中内存管理的一些看法和认识. 我比较喜欢搞清楚一个技术本身的发展历程,简而言之就是这个技术是怎么发展而来的,在这个技术之前存在哪些技术,这些技术有哪些特点,为什么会被目前的技术所取代,而目前的技术又解决了之前的

简述OC中内存管理机制。

1        简述OC中内存管理机制.与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,readonly,assign,retain,copy,nonatomic .atomic.strong.weak属性的作用? OC使用了一种叫做引用计数的机制来管理对象,如果对一个对象使用了alloc.[Mutable]copy,retain,那么你必须使用相应的realease或者aut

Ubuntu更新源地址出现问题的解决方法===&gt;直接用wget命令去相关地址下载好了

源一直有问题.只好这样.==> 转:http://blog.csdn.net/hitabc141592/article/details/7561239 wget是linux最常用的下载命令, 一般的使用方法是: wget + 空格 + 要下载文件的url路径 例如: # wget http://www.linuxsense.org/xxxx/xxx.tar.gz 简单说一下-c参数, 这个也非常常见, 可以断点续传, 如果不小心终止了, 可以继续使用命令接着下载 例如: # wget -c ht