leveldb分析 Arena記憶體管理

2022-08-21 15:48:12 字數 1761 閱讀 9735

leveldb中實現了乙個簡單的記憶體管理工具arena,其基本思想為:先預先向系統申請一塊記憶體,此後需要申請記憶體時,直接到預先分配的記憶體中申請。

那麼這樣做的目的是什麼呢?

(1)避免了頻率地進行malloc/new和free/delete操作,同時對於記憶體管理變得簡單,對於記憶體的釋放工作交給arena。

(2)避免造成大量的記憶體碎片。(還需去了解一下)

下面看具體的原始碼分析:

arena定義:

class

arena

private:

char*allocatefallback(size_t bytes);

char*allocatenewblock(size_t block_bytes);

//allocation state

char*alloc_ptr_;

size_t alloc_bytes_remaining_;

//array of new allocated memory blocks

std::vectorblocks_;

//bytes of memory in blocks allocated so far

size_t blocks_memory_;

//no copying allowed

arena(const arena&);

void

operator=(const arena&);

};

arena提供兩種分配方式:所分配的記憶體嚴格對齊、不一定嚴格對齊的分配方式。每次預先分配的4k(為什麼是4k?)儲存到blocks_ vector中,最後統一釋放。這種記憶體管理方式是具有一定的適用範圍,如需不斷分配小記憶體,最終一併全釋放的場景。對於leveldb來說,memtable恰好就是這樣的,每次向memtable中insert一條k/v時,就申請一塊記憶體,當memtable被flush到磁碟且不再使用時,將整個memtable釋放掉。

inline char*arena::allocate(size_t bytes) 

return

allocatefallback(bytes); //預先分配的不足

}

char*arena::allocatefallback(size_t bytes) 

//we waste the remaining space in the current block. 預分配的記憶體剩下的已很少,所以直接重新分配一塊,也就是說浪費了一點記憶體

alloc_ptr_ =allocatenewblock(kblocksize);

alloc_bytes_remaining_ =kblocksize;

char* result =alloc_ptr_;

alloc_ptr_ +=bytes;

alloc_bytes_remaining_ -=bytes;

return

result;

}

下面來看下嚴格對齊的分配方式

char*arena::allocatealigned(size_t bytes)  

else

assert((reinterpret_cast

(result) & (align-1)) == 0

);

return

result;

}char*arena::allocatenewblock(size_t block_bytes)

leveldb原始碼分析之Arena

arena 是 leveldb 專案裡面使用的輕量級的記憶體池物件,leveldb 用這個物件來管理記憶體的分配,簡化了 new 和 delete 的呼叫,我們也可以從這個輕量級的記憶體池物件學習 google 大神工程師是如何管理記憶體的。arena 記憶體管理模型 arena 使用下面幾個成員變...

leveldb原始碼分析 記憶體池 Arena

模組資訊 util arena.h util arena.cc 模組概要 用於實現乙個簡單的記憶體池,有兩種記憶體分配方式,一種是普通分配,一種是對齊分配 主要介面 方法說明 char arena allocate size t bytes 普通方式分配記憶體 char arena allocate...

LevelDB 原始碼解析之 Arena

github emai debugzhang 163.com 華為雲社群 leveldb 記憶體池的存在主要就是減少呼叫malloc或者new的次數,減少記憶體分配所帶來的系統開銷,提公升效能。leveldb 中的記憶體池是由類arena實現的。arena先向系統申請一塊大的記憶體,當其他元件需要申...