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

新闻 前端
谷歌表示,其 TCMalloc 可以代替 C 和 C++ 默认内存分配器,提供更高的扩展效率和更好的并行性支持。

  [[318169]]

谷歌表示,其 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++ 定制的内存分配器

https://github.com/google/tcmalloc/blob/master/docs/design.md

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

责任编辑:张燕妮 来源: 架构头条
相关推荐

2017-01-20 14:21:35

内存分配器存储

2017-01-17 16:17:48

C++固定分配器

2017-02-08 08:40:21

C++固定内存块

2013-10-12 11:15:09

Linux运维内存管理

2024-10-11 10:00:20

2023-04-03 08:25:02

Linux内存slub

2011-07-15 01:10:13

C++内存分配

2009-12-25 15:34:54

slab分配器

2020-12-15 08:54:06

Linux内存碎片化

2021-08-03 09:02:58

LinuxSlab算法

2023-12-22 07:55:38

Go语言分配策略

2010-02-04 14:58:06

C++内存分配

2022-06-01 14:02:47

谷歌Chrome 安全团C++

2013-10-14 10:41:41

分配器buddy syste

2021-12-16 06:52:33

C语言内存分配

2023-04-13 14:42:26

PoE供电器PoE交换机

2022-01-13 10:30:21

C语言内存动态

2011-04-11 09:47:50

C++内存管理

2023-12-27 13:55:00

C++内存分配机制new

2011-04-11 09:43:25

C++C
点赞
收藏

51CTO技术栈公众号