再谈内存分配器的优缺点

结论

在频繁申请、释放内存的工作场景,建议需要考虑定制化的内存分配器Allocator

优点

那么用内存分配器有那些好处呢?在近段研究和积累看来,主要有以下几点:

  • 拥有连续内存的访问优势
  • 较浅的申请、释放栈访问深度;甚至可以无锁访问
  • 避免与全局内存管理器多线程锁竞争。如图所示:
  • 可有效避免内存碎片的形成

谈点缺点

对于它的劣势,说不上缺点,可能就是增加了一点风险。

风险

内存corruption风险,即使使用Glibc Malloc内存管理器,风险依然同样存在!

在C语言体系里,管理器通常在申请内存的头部或尾部预留了控制信息,以利于"随身"的内存管理。

所以在这点上,无论是定制内存管理器Allocator,还是用Glibc Malloc全局内存管理器,将具有相同数量的内存控制块信息。

只是业务层使用的内存管理器Allocator,因为申请内存位置之间更接近,改写风险会稍大一点。

但整体上应该瑕不掩瑜 😃 很难有十全十美的设计!

注意: 如果申请内存控制块信息被意外改写,将导致内存损坏、甚至是破坏,造成非法访问异常!


使用经验ACE内存管理器

  • Allocator体系

可以对其进行层叠,以实现类似ACE_Malloc<...> 无限内存的效果

  • ACE_Malloc< ACE_MEM_POOL_1, ACE_LOCK >体系

对于特别是ACE_Malloc< ACE_Local_Memory_Pool, ACE_LOCK >

根据业务使用特点,业务应在初始化时,首先申请一大块内存,例如,MB级别,然后立即将其释放;后期更小、随机大小的小块内存申请释放,就在这个大的内存池中分配,而不是默认以PageSize为单位的内存池大小。、
当然,ACE_Malloc<...> 无限内存 内存的特点,当池子中内存不足时,依然会以满足当前申请量,但实际为PageSize大小整数倍的数量申请新内存,形成更大的池子

相关推荐
只吹45°风2 个月前
Mybatis-为什么使用Mybatis,它存在哪些优点和缺点?
mybatis·优点·缺点
Seal软件1 年前
为何 DevOps 会给开发人员带来压力和倦怠?
devops·缺点