Categories
程式開發

谷歌開源TCMalloc,專為C和C++定制的內存分配器


谷歌表示,其TCMalloc可以代替C和C++默認內存分配器,提供更高的擴展效率和更好的並行性支持

為了避免誤解,值得注意的是,這實際上是谷歌第二次開源其內存分配器。事實上,谷歌在2005年就已經提供了其內存分配器,當時是作為谷歌性能工具的一部分連同其他工具一起推出的,其中包括內存分析器、旨在確保堆一致性的堆檢查器以及基於Perl的ppro配置分析器和可視化工具。儘管有這麼回事,但是,谷歌使用的內部版本隨著時間的推移與外部版本出現了差異,因此,現在谷歌開源了TCMalloc的當前版本,其包括一些改進,如每個CPU緩存、一定規模大小的刪除、快/慢路徑改進,等等。

該倉庫是谷歌目前TCMalloc的實現,我們在生產中的所有C++程序都在使用它。該代碼僅限於內存分配器實現本身。

如前所述,TCMalloc包括C*alloc族和針對C++::operator new以及::operator delete的實現。與C和C++標準庫提供的相應功能相比,它們提供了大量優化。例如,TCMalloc 利用固定大小的“頁”從操作系統執行分配任務,從而簡化了簿記過程。此外,其中一些頁面專門用於特定大小的對象,如所有16字節的對象。在需要獲取或釋放內存的時候,這還帶來了簡化。最後,它還會緩存常用對像以提高操作速度。

TCMalloc還通過MallocExtension支持遙測擴展,這對於收集堆探查結果和快照以調查內存行為很有用。

有一些配置選項可用來調試TCMalloc性能。特別是,我們可以定義邏輯頁面大小,它們可以是4KiB、8KiB、32KiB或256KiB。更大的頁面將減少從操作系統請求新頁面分配的可能性,從而以更大的內存消耗為代價實現更快的操作。它還可以基於每個線程或每個CPU來設置緩存大小,這是默認設置。最後,我們可以調整內存釋放的積極程度,這也會在幾個方面影響性能。

TCMalloc架構如下圖所示,在相關文檔中有詳細的描述:

谷歌開源TCMalloc,專為C和C++定制的內存分配器 1

TCMalloc只能使用谷歌內部構建系統Bazel來構建,對於一些使用其他構建系統的開發人員來說,這可能有點讓人感覺意外。但是對macOS、Ubuntu、Fedora和Windows來說都有二進制格式的Bazel可用,因此,這應該不會成為主要障礙。

原文鏈接:

TCMalloc, Google’s Customized Memory Allocator for C and C++, Now Open Source