leveldb中實現了乙個簡單的記憶體管理工具arena,其基本思想為:先預先向系統申請一塊記憶體,此後需要申請記憶體時,直接到預先分配的記憶體中申請。
那麼這樣做的目的是什麼呢?
(1)避免了頻率地進行malloc/new和free/delete操作,同時對於記憶體管理變得簡單,對於記憶體的釋放工作交給arena。
(2)避免造成大量的記憶體碎片。(還需去了解一下)
下面看具體的原始碼分析:
arena定義:
classarena提供兩種分配方式:所分配的記憶體嚴格對齊、不一定嚴格對齊的分配方式。每次預先分配的4k(為什麼是4k?)儲存到blocks_ vector中,最後統一釋放。這種記憶體管理方式是具有一定的適用範圍,如需不斷分配小記憶體,最終一併全釋放的場景。對於leveldb來說,memtable恰好就是這樣的,每次向memtable中insert一條k/v時,就申請一塊記憶體,當memtable被flush到磁碟且不再使用時,將整個memtable釋放掉。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&);
};
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先向系統申請一塊大的記憶體,當其他元件需要申...