AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

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

  • 2020-03-10
  • 本文字数:902 字

    阅读完需:约 3 分钟

谷歌开源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


2020-03-10 08:054049

评论

发布
暂无评论
发现更多内容

KubeVela 插件指南:轻松扩展你的平台专属能力

阿里巴巴云原生

阿里云 开源 容器 云原生 KubeVela

一次TiDB GC阻塞引发的性能问题分析

TiDB 社区干货传送门

性能调优 管理与运维 故障排查/诊断

每日一题之请描述Vue组件渲染流程

bb_xiaxia1998

Vue

【web 开发基础】PHP 循环结构之 for 循环 -PHP 快速入门 (19)

迷彩

for循环 10月月更 web开发基础 PHP基础

「Go工具箱」go语言csrf库的使用方式和实现原理

Go学堂

golang 开源 程序员 CSRF 10月月更

react源码中的协调与调度

flyzz177

React

在世界舞台MBBF一骑绝尘:永远更快一步的北京5G是怎样炼成的?

脑极体

前端面试中小型公司都考些什么

loveX001

JavaScript

腾讯前端经典react面试题汇总

beifeng1996

React

从React源码来学hooks是不是更香呢

goClient1992

React

嵌入式 Linux 入门(七、Linux 下的环境变量)

矜辰所致

Linux 环境变量 10月月更

前端面试指南之JS面试题总结

loveX001

JavaScript

TiDB 生产集群与加密通讯TLS的辛酸苦辣 - 开启篇

TiDB 社区干货传送门

集群管理 管理与运维

一面高频vue面试题

bb_xiaxia1998

Vue

react源码中的生命周期和事件系统

flyzz177

React

等保备案和通信网络单元定级备案的五大区别讲解

行云管家

等保 等级保护 等保备案

干货好文 | 初探MySQL迁移到ClickHouse

沃趣科技

MySQL Clickhouse

深入理解JS作用域链与执行上下文

loveX001

JavaScript

JVM 组成结构分析

Andy

从React源码角度看useCallback,useMemo,useContext

goClient1992

React

JVM 浅析(二)

Andy

每日一题之Vue的异步更新实现原理是怎样的?

bb_xiaxia1998

Vue

Nginx浅析

Andy

云小课|MRS基础原理之Hudi介绍

华为云开发者联盟

大数据 华为云 企业号十月 PK 榜

什么是分布式数据库?我不信,看完这篇你还不懂!

TiDB 社区干货传送门

数据库架构设计 数据库前沿趋势

问:你是如何进行react状态管理方案选择的?

beifeng1996

React

问:React的useState和setState到底是同步还是异步呢?

beifeng1996

React

《一条select 语句在TiDB Server层都发生了什么》

TiDB 社区干货传送门

管理与运维

顶级的计算机科学家是如何养成的?

博文视点Broadview

【IT运维小知识】如何通俗理解节点、集群以及主从?

行云管家

高可用 高可用HA

MySQL高级:explain分析SQL,索引失效&常见优化场景

程序员小毕

Java MySQL 数据库 后端 索引

谷歌开源TCMalloc,专为C和C++定制的内存分配器_编程语言_Sergio De Simone_InfoQ精选文章