首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

谷歌开源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只能使用谷歌内部构建系统Bazel来构建,对于一些使用其他构建系统的开发人员来说,这可能有点让人感觉意外。但是对macOS、Ubuntu、Fedora和Windows来说都有二进制格式的Bazel可用,因此,这应该不会成为主要障碍。

原文链接:

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

  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/20BRe5AgCvXwYgACEZzG
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券