简介
Arena 是leveldb 实现的简单的内存池,以最小4096bytes 为单位申请block, 使用指针记录当前block 中空余内存起始位置以及当前block剩余空间。将所有的block 放到blocks_ 数组中。Arena 提供了分配内存以及分配对齐的内存的两种接口,没有释放内存的接口,当Arena 的生命周期结束时,由Arena 的析构函数统一释放内存。Arena 的主要结构如下图所示:
Leveldb 代码实现
leveldb arena 实现在util/arena.h 以及 util/arena.cc
接口以及成员
class Arena {
public:
Arena();
~Arena();
// Return a pointer to a newly allocated memory block of "bytes" bytes.
// 分配指定大小的内存,并返回分配内存的首地址
char* Allocate(size_t bytes);
// 分配指定大小并且对齐的内存
// Allocate memory with the normal alignment guarantees provided by malloc
char* AllocateAligned(size_t bytes);
// Returns an estimate of the total memory usage of data allocated
// by the arena.
// 统计使用了多少内存
size_t MemoryUsage() const {
return reinterpret_cast<uintptr_t>(memory_usage_.NoBarrier_Load());
}
private:
// 分配内存,根据情况决定是否使用新的block
char* AllocateFallback(size_t bytes);
// 分配一个新的block
char* AllocateNewBlock(size_t block_bytes);
// Allocation state
// 指向一个block中未被使