LevelDB源码分析之内存管理类arena

本文深入探讨了LevelDB中用于减少内存碎片的Arena内存管理器。它通过自定义内存分配策略来提升memtable的效率,特别是在skiplist写入过程中。文章详细介绍了Arena的工作原理及其如何处理小块和大块内存分配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LevelDB源码分析之内存管理类arena

      Leveldb的大部分内存管理依赖于C++语言的默认实现,也就是不对内存进行管理。只是在memtable的实现中用到了一个简单的内存管理器(arena)。因为memtable的内部实现skip list写入时,需要分配新节点,大量节点的直接分配可能会带来较多的碎片,影响运行效率。因此,leveldb在每个memtable中都会绑定一个arena,在memtable进行minor compact后,memtable销毁时进行统一释放。
下图是一个arena某个运行时刻的截图。从图中可以看出,arena内部使用的基本块大小为4K,已分配的块的指保存在一个vector中。具体分配策略如下。若分配的内存可从剩余的块中分配,则直接从剩余块中分配并调整剩余块指针的位置。否则检查要分配的size是否大于1/4的block(也就是1K),若大于则直接new所需大小的内存,将指针保存在vector中并返回内存指针。从这里可以看出,vector保存的内存块的指针大小可能>4K,也就是对大内存块直接分配。前面两个条件若都不满足,则需要new一个基本块(=4K),将new出来的新块作为当前块,从这块当中分配内存并调整当前内存指针位置。原来当前块的剩余内存就被浪费掉了。

       如下图所示:

leveldb arena

      代码片段解析:

  // alloc_ptr_指向基本块空闲内存位置,alloc_bytes_remaining_为剩余内存大小
  // blocks_保存了所有的块,包括了基本块与直接分配的大块
  // blocks_memory_表示至今blocks分配的内存
  char* alloc_ptr_;  
  size_t alloc_bytes_remaining_;

  // Array of new[] allocated memory blocks
  std::vector<char*> blocks_;

  // Bytes of memory in blocks allocated so far
  size_t blocks_memory_;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值