無論是在游戲開發,或者其他長期運行的服務開發中,對內存的使用一直是架構師或者主程序在最初就要關注的point,如果內存使用不當,頻繁申請釋放內存造成系統負擔過大,性能降低,到最后產生大量內存碎片,無法申請可利用內存,最終宕機,給廣大程序員同學造成長期加班的痛苦。
在講到tcmalloc之前,這里不得不說GLIBC的資源釋放機制:
1. glibc在多線程內存分配的場景下為了減少lock contention,會new出很多arena出來,每個線程都有自己默認的arena,但是內存申請時如果默認arena被占用,則round-robin到下一個arena。
2. 每個arena的空間不可直接共享和互相借用,除非通過主arena釋放給操作系統然后被各個輔助arena重新申請。
3. glibc歸還內存給OS有一個很苛刻的條件就是top chunk必須是free的,否則,即使應用程序已經釋放了大片內存,glibc也不會將這些內存歸還給OS。
這里我引入tcmalloc,相當于常見的內存池,tcmalloc的優勢體現在:
(1)分配內存頁的時候,直接跟OS打交道,而常用的內存池一般是基于別的內存管理器上分配,如果完全一樣的內存管理策略,明顯tcmalloc在性能及內存利用率上要省掉第三方內存管理的開銷。之所以會出現這種情況,是因為大部分寫內存池的coder都不太了解OS
(2)大部分的內存池只負責分配,不管回收。