(1)集成在glibc中,Linux主要發行版的通用實現。緩存
(1)後分配的內存先釋放。因爲ptmalloc2收縮內存是從top chunk開始,若是與top chunk相鄰的chunk不能釋放,top chunk 如下的chunk都沒法釋放。
(2)多線程鎖開銷大,須要避免多線程頻繁分配釋放。
(3)內存從thread的arena中分配,不能從一個arena移動到另外一個arena。若是多線程使用內存不均衡,容易致使內存的浪費。
(4)每一個chunk至少8字節的開銷很大。
(5)不按期分配長生命週期的內存容易形成內存碎片,不利於回收。 性能優化
(1)小內存在線程ThreadCache中分配,不加鎖(加鎖代價大約100ns)。
(2)大內存直接按照大小調用mmap系統調用分配。
(3)大內存加鎖使用更高效的自旋鎖。
(4)減小內存碎片。多線程
(1)使用大內存頻繁時,內存在Central Cache或者Page Heap加鎖分配。
(2)TCMalloc對大量小內存的分配過於保守,對於內存需求較大的服務(如推薦系統),小內存上限太低。若是請求量過多,鎖衝突嚴重,CPU使用率將指數暴增。ide
當線程數量不定時,使用TCMalloc。性能
(1)採用多個arena來避免線程同步。
(2)使用細粒度鎖,大大減小加鎖。
(3)TCache GC時對緩存容量進行動態調整。優化
JeMalloc內存分配器的缺點在於arena 間的內存不可見。
(1)某個線程在arena使用了大量內存,但arena 並無其它線程使用,致使arena 內存沒法被回收,佔用過多。
(2)兩個位於不一樣arena的線程頻繁進行內存申請,致使兩個arena的內存出現大量交叉,但連續的內存因爲在不一樣arena而沒法進行合併。線程
當線程數量固定,不會頻繁建立退出時,可使用jemalloc。blog