好的内存池-why可回收内存池

本文探讨了内存池的实现方式及其局限性,特别是在程序运行过程中内存需求变化时的问题。介绍了不可回收内存池的工作原理及由此带来的挑战,并提出了合理使用内存池的建议。

内存池相信都不陌生,实现的方法也有很多,简单的,复杂的,不一而足,网上也有很多现成的实现代码。

但大多有一个缺点,不可回收--也就是说刚开始那内存池分配的是多大,程序运行期间就一直那么大。

这种实现方式被大量的内存池实现所应用,比较简单,效率也比较高,但其还是有局限的。

大家可以试一下,当你在运行一个大的程序,该程序占据了大量的内存,此时你把它最小化,在windows任务管理器中,你会看到该程序的内存占用量剧减,其实并不是这先内存被释放了,是windows在背后做的小动作--windows把一些该程序不常用到的内存区间都写到磁盘上的pagefile中了。当程序被再次拉向前台时,该程序需要使用的内存就会再次从pagefile中装回来。如果这段内存量很大的话,而硬盘的读盘速度又不是很快,这时你就会明显的感觉到停滞感,甚至连键盘鼠标的响应都会延迟,这在打游戏的时候应该是很常见的。

所以,当你用不可回收的内存池申请了一块很大的区间时,你的程序可能已经用完了他,在内存池的记录中,该内存段也被标记为“可再次使用”,可是windows并不知道,它只知道用户申请了这样一块内存,并且始终不还给它。但是呢,这块内存的利用率又比较小,这时windows就回想,既然它不怎么被使用,那就把它写硬盘上吧。问题就来了....

当然,这种问题在内存池不是很大,使用率又很高的情况下是很微小的,但是如果在这样一种情况(也是笔者曾考虑过的情况):

1.内存池在程序中大量应用。

2.对内存区域分段,比如32字节以内的内存需求量分为一段,32·64一段,64·128一段.....

总的来说,这种方法也是挺好的,主要考虑到减小内存碎片。将差不多内存大小的放在一起,方便再次划分,提高索引效率等。

但也还是避免不了上面的问题,尤其是那种大型内存需求段的情况。

所以内存池使用还是需斟酌的,不可不用,不可滥用,关键是找出其中一个适合的量,可回收的内存池,也是要掌握一个量,经常的回收肯定不利于效率的提升,考虑平台,鉴戒前人经验,以及尽可能的实验的情况下就能尽量的找到这个度。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值