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

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_;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值