内存池原理

为什么需要内存池

  1. 内存池主要作用是提高分配回收效率,因为每次new delete都要进入到内核,是一个效率相对较低的操作。
  2. 系统中不用内存池,也不会产生大量的内存碎片

内存池主要是针对频繁分配释放的小块。
我们一次性分配一个大块(如:4K。假设这些小块一定小于4K),以后管理这个大块就行了。

内存池的原理

现在遇到的问题是如何分配这个4K?
第一个是分配,第二个是回收,第三个是扩容

假设1:
4K - 8bytes = 2K + 1K + 512 + 256 + 128 + 64 + 32 + 16 + 8(伙伴算法
在回收的时候会出现一种情况,因为可能一个数据使用了两个不连接,这样是可以分配的,但是却无法回收。(回收之后可能需要合并,条件是大小相同的相邻两块都是空闲的,就会合并成一个稍大一些的块))所以小块这种方式以字节为单位来做并不合适,以页为单位比较合适。
比如:4K一页。适合在物理内存的分配与回收。

假设2:
a * 8 + b * 16 + c * 32 + d * 64 + e * 128 + f * 256 = 4K(slab算法
将4K空间初始划分成多个8bytes,多个16bytes……需要的内存x<8则分配8bytes,8 < x < 16时分配16。假如8bytes的用完了,则将16bytes分成8+8,分一块给它。

伙伴算法
在这里插入图片描述

slab算法
在这里插入图片描述
在这里插入图片描述

slab机制要解决的问题:

  1. 减少伙伴算法分配小块连续内存时所产生的内部碎片
  2. 将频繁使用的对象缓存起来,减少分配、初始化、释放对象的时间开销
  3. 通过着色技术调整对象一更好地使用硬件高速缓存

【注】:
1、如果虚拟内存不断在涨,怎么处理?
(1)内存池是否有内存泄漏(先检查自己写的代码)(使用内存池的时候,会对应的加上打印信息)
(2)如果没有引入内存池,可以采用tcmalloc / jemalloc解决这种问题
(3)第三方的lib库是否有内存泄漏(这里肯定没有使用我们自己写的内存池)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值