GNU Libc 的內存分配器(allocator)—ptmalloc,起源於Doug Lea的malloc。由Wolfram Gloger改進得到可以支持多線程。
tcmalloc是Google開發的內存分配器,在Golang、Chrome中都有使用該分配器進行內存分配。有效的優化了ptmalloc中存在的問題。當然為此也付出了一些代價,按下不表,先看tcmalloc的具體實現。
TCMalloc是專門對多線並發的內存管理而設計的,TCMalloc主要是在線程級實現了緩存,使得用戶在申請內存時大多情況下是無鎖內存分配。整個 TCMalloc 實現了三級緩存,分別是ThreadCache(線程級緩存),Central Cache(中央緩存:CentralFreeeList),PageHeap(頁緩存),最后兩級需要加鎖訪問。如圖為內存分配
jemalloc是facebook推出的,目前在firefox、facebook服務器、android 5.0 等服務中大量使用。 jemalloc最大的優勢還是其強大的多核/多線程分配能力. 以現代計算機硬件架構來說, 最大的瓶頸已經不再是內存容量或cpu速度, 而是多核/多線程下的lock contention(鎖競爭). 因為無論CPU核心數量如何多, 通常情況下內存只有一份. 可以說, 如果內存足夠大, CPU的核心數量越多, 程序線程數越多, jemalloc的分配速度越快。
mimalloc是微軟最近開源的一個malloc實現,其實驗數據表明相比於jemalloc、tcmalloc等實現大約快了10%。其通過將空閑塊列表(Free List)進行分片(Sharding)來保證分配的內存有更好的空間的局部性,從而提升性能。