当前位置: 首页 > 科技观察

谷歌开源TCMalloc,为C和C++定制的内存分配器

时间:2023-03-18 20:35:31 科技观察

谷歌表示其TCMalloc可以替代C和C++默认的内存分配器,提供更高的扩展效率和更好的并行支持。为避免误解,值得注意的是,这实际上是谷歌第二次开源其内存分配器。事实上,谷歌自2005年以来就提供了它的内存分配器,当时它作为谷歌性能工具的一部分与其他工具一起推出,包括内存分析器、旨在确保堆一致性的堆检查器,以及基于Perl的ppro配置分析器和可视化工具。尽管如此,谷歌使用的内部版本随着时间的推移与外部版本发生了分歧,所以现在谷歌已经开源了当前版本的TCMalloc,其中包括改进如per-CPU缓存、特定大小、快/慢路径改进、等。此存储库是Google当前的TCMalloc实现,我们在生产中的所有C++程序都使用它。该代码仅限于内存分配器实现本身。如前所述,TCMalloc包括C*alloc系列以及C++的::operatornew和::operatordelete的实现。与C和C++标准库提供的相应功能相比,它们提供了大量的优化。例如,TCMalloc利用固定大小的“页面”从操作系统执行分配任务,从而简化了簿记过程。此外,其中一些页面专用于特定大小的对象,例如所有16字节的对象。这也简化了何时需要获取或释放内存。最后,它还缓存经常使用的对象以加速操作。TCMalloc还通过MallocExtension支持遥测扩展,这对于收集堆配置文件结果和快照以调查内存行为很有用。有几个配置选项可用于调整TCMalloc性能。特别是,我们可以定义逻辑页面大小,可以是4KiB、8KiB、32KiB或256KiB。更大的页面将减少从操作系统请求新页面分配的可能性,从而以更大的内存消耗为代价实现更快的操作。它还可以在每个线程或每个CPU的基础上设置缓存大小,这是默认设置。最后,我们可以调整内存释放的积极程度,这也会以多种方式影响性能。TCMalloc架构如下图所示,在相关文档中有详细描述:https://github.com/google/tcmalloc/blob/master/docs/design.mdTCMalloc只能使用谷歌内部构建系统Bazel构建,对于一些使用其他构建系统的开发者来说,这可能会有点意外。但是Bazel以二进制形式提供用于macOS、Ubuntu、Fedora和Windows,因此这应该不是主要障碍。