C++性能優化(十一) —— 內存管理器性能分析

C++性能優化(十一) —— 內存管理器性能分析

一、PTMalloc2

1、PTMalloc2優點

(1)集成在glibc中,Linux主要發行版的通用實現。

2、PTMalloc2缺點

(1)後分配的內存先釋放。由於ptmalloc2收縮內存是從top chunk開始,如果與top chunk相鄰的chunk不能釋放,top chunk 以下的chunk都無法釋放。
(2)多線程鎖開銷大,需要避免多線程頻繁分配釋放。
(3)內存從thread的arena中分配,不能從一個arena移動到另一個arena。如果多線程使用內存不均衡,容易導致內存的浪費。
(4)每個chunk至少8字節的開銷很大。
(5)不定期分配長生命週期的內存容易造成內存碎片,不利於回收。



二、TCMalloc

1、TCMalloc優點

(1)小內存在線程ThreadCache中分配,不加鎖(加鎖代價大約100ns)。
(2)大內存直接按照大小調用mmap系統調用分配。
(3)大內存加鎖使用更高效的自旋鎖。
(4)減少內存碎片。


2、TCMalloc缺點

(1)使用大內存頻繁時,內存在Central Cache或者Page Heap加鎖分配。
(2)TCMalloc對大量小內存的分配過於保守,對於內存需求較大的服務(如推薦系統),小內存上限過低。如果請求量過多,鎖衝突嚴重,CPU使用率將指數暴增。

3、TCMalloc使用場景

當線程數量不定時,使用TCMalloc。

三、JeMalloc

1、JeMalloc優點

(1)採用多個arena來避免線程同步。
(2)使用細粒度鎖,大大減少加鎖。
(3)TCache GC時對緩存容量進行動態調整。

2、JeMalloc缺點

JeMalloc內存分配器的缺點在於arena 間的內存不可見。
(1)某個線程在arena使用了大量內存,但arena 並沒有其它線程使用,導致arena 內存無法被回收,佔用過多。
(2)兩個位於不同arena的線程頻繁進行內存申請,導致兩個arena的內存出現大量交叉,但連續的內存由於在不同arena而無法進行合併。

3、JeMalloc使用場景

當線程數量固定,不會頻繁創建退出時,可以使用jemalloc。

四、不同內存管理器性能比較

C++性能優化(十一) —— 內存管理器性能分析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章