首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
其他好文
> 详细
解决UDT中内存下不去的问题
时间:
2016-07-19 18:20:56
阅读:
137
评论:
0
收藏:
0
[点我收藏+]
标签:
使用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并不擅长管理长生命周期的内存,尤其是持续不定期分配和释放长生命周期的内存,这会导致内存暴增。
解决UDT中内存下不去的问题
标签:
原文地址:http://www.cnblogs.com/shenlinken/p/5685582.html
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
分布式事务
2021-07-29
OpenStack云平台命令行登录账户
2021-07-29
getLastRowNum()与getLastCellNum()/getPhysicalNumberOfRows()与getPhysicalNumberOfCells()
2021-07-29
【K8s概念】CSI 卷克隆
2021-07-29
vue3.0使用ant-design-vue进行按需加载原来这么简单
2021-07-29
stack栈
2021-07-29
抽奖动画 - 大转盘抽奖
2021-07-29
PPT写作技巧
2021-07-29
003-核心技术-IO模型-NIO-基于NIO群聊示例
2021-07-29
Bootstrap组件2
2021-07-29
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!