TCMalloc详解

TCMalloc TCMallocGoogle开发的内存分配器。全称Thread-Caching Malloc,即线程缓存的malloc,实现了高效的多线程内存管理,用于替代系统的内存分配相关的函数(malloc、free,new,new[]等)。 TCMalloc 可以分为三部分: 前端(front-end)、中端(middle-end)、后端(back-end)。 * 前端是一个缓存,为应用程序快速提供内存分配和内存解除。 * 中端负责为前端补充缓存。 * 后端从系统OS中获取内存。 注释:前端能运行在pe 阅读详情


本文部分内容是结合参考其他文章已经tcmalloc官方文档。

TCMalloc

​ TCMalloc 是 Google 对 C 的 malloc() 和 C++ 的 operator new 的自定义实现,用于在我们的 C 和 C++ 代码中进行内存分配。 TCMalloc 是一种快速、多线程的 malloc 实现。

​ TCMalloc为每个线程分配了缓存,这个缓存是线程私有的,可以减少多线程程序竞争。对于小对象的内存分配,首先会去请求线程缓存,不用加锁,如果缓存不能满足的话,需要去向后面的内存存储结构中获取,此时需要加锁获取,因为其他线程可能正在获取内存空间,但是大部分情况下线程缓存就可以满足内存请求,所以几乎不需要锁。对于大对象的内存分配,TCMalloc尝试着使用细粒度和高效的自旋锁。另外一个TCMalloc的好处是小对象内存分配效率高。例如,分配n个8 byte的对象时,使用大约8n * 1.01byte的空间,只有百分之一的空间浪费。ptmalloc2分配内存的方法为每个对象使用一个4 byte的标头,并且将大小四舍五入为8 byte的倍数,最终使用16n byte。

虚拟内存

​ 有一个结论需要提一下,我们的进程是运行在虚拟内存上的,图示如下:

在这里插入图片描述

  • 对于我们的进程而言,可使用的内存是连续的

  • 安全,防止了进程直接对物理内存的操作(如果进程可以直接操作物理内存,那么存在某个进程篡改其他进程数据的可能)

  • 虚拟内存和物理内存是通过MMU(Memory Manage Unit)映射的(感兴趣的可以研究下)

  • 等等(感兴趣的可以研究下)

    所以,以下文章我们所说的内存都是指虚拟内存

TCMalloc架构

​ 下面这幅图粗略的介绍了TCMalloc的内部结构:

在这里插入图片描述

​ 我们可以将TCMlloc分为三部分,front-end, middle-end, back-end。 它们的职责分别是:

  • Front-end是一个缓存,提供内存快速分配和重分配内存给应用程序的功能。它主要有2部分组成:Per-thread cache和Per-CPU cache。这里只聊 Per-thread模式。
  • Middle-end负责给front-end提供缓存。当front-end缓存不足时,首先从middle-end中获取。它由Central free list组成。
  • Back-end负责从系统获取内存。当middle-end中的内存不足时,从back-end中获取。它主要设计page heap的内容。

​ 注意一下,front-end可以在per-cpu或者legacy per-thread模式下运行,后端可以支持hugepage aware pageheap或者legacy pageheap。

TCMalloc Front-end

Front-end可以处理特定大小的内存分配请求。Front-end有一个线程缓存,可用于分配或保存空闲内存。这个缓存一次只能被一个线程访问,所以它不需要任何锁,因此大多数分配和释放都很快。

​ 如果Front-end具有适当大小的内存缓存,可以直接从缓存中为程序分配对象。如果该特定大小的内存块为空,则Front-end将从Middle-end请求一批内存以重新填充缓存。中端包括 CentralFreeListTransferCache

​ 如果Middle-end可用的内存空间耗尽,或者请求的大小大于Front-end缓存的最大大小,则请求会去Back-end中获取内存,或者重新填充Middle-end的内存。后端也称为 PageHeap。

​ TCMalloc 前端有两种实现:

  • 最初它支持对象的每线程缓存(因此得名Thread-local malloc)。然而,Thread-local

【形象解析】ptmalloc、tcmalloc与jemalloc对比 对于ptmalloc,tcmalloc,jemalloc网上有很多解析,讲的很好也很仔细,但是想要彻底看懂还是很有难度的,我这篇文章主要以自己的理解并结合形象的举例对比三者的区别,相对于大部分文章我不会深入的探讨三者的具体结构,而是从接触新手的角度,通过对比三者的区别,以举例子让大家对这三个常见内存池有一个整体且直观的概念,其中有很多地方舍弃了结构设计的细节,只保留核心的申请释放过程,讲解相对来讲没有那么严谨,如有错误请在评论区指正。 阅读详情

相关推荐

tcmalloc(高并发内存池)简化版讲解-项目

高清发不上去,私我发高清,项目完整代码@我。

2201_75352618的博客 897

【性能】tcmalloc 使用和原理

安装 安装bazel tcmalloc项目的的管理是用bazel,所以先安装bazel: 在线安装:yum install bazel,如果不行考虑下面的 cd/etc/yum.repos.d/ wget https://copr.fedorainfracloud.org/coprs/vbatts/bazel/repo/epel-7/vbatts-bazel-epel-7.repo yum install bazel 如果还是不行,考虑离线安装。手动从github下载预编译bazel二进制.

我的笔记本 1万+

TCMalloc:线程缓存Malloc

TCMalloc:线程缓存Malloc 一. TCMalloc的内存管理框架                             由上图可知:TCMalloc通过三级缓存来实现对内存的管理:ThreadCache,CentralCache和PageHeap。ThreadCache和CentralCache通过批量的内存块进行交互,CentralCache和PageHea

chenglinhust的专栏 1414

C++性能优化(九) —— TCMalloc

一、TCMalloc简介 1、TCMalloc简介 TCMalloc(Thread-Caching Malloc,线程缓存的malloc)是Google开发的内存分配算法库,最初作为Google性能工具库perftools的一部分,提供高效的多线程内存管理实现,用于替代操作系统的内存分配相关的函数(malloc、free,new,new[]等),具有减少内存碎片、适用于多核、更好的并行性支持等特性。 TCMalloc属于gperftools,gperftools项目包括heap-checker、h..

天山老妖 6250

高并发内存池(手写min版tcmalloc)--6W字详解

想了解Google TCMalloc如何实现高效内存分配吗?本文带你用手写代码的方式实现核心逻辑并配有详细解释,彻底搞懂高并发内存池的设计精髓! 通过这片文章了解三级缓存分层设计:ThreadCache:线程独享的无锁缓存,秒级分配小内存、CentralCache:全局中心缓存,智能合并碎片内存、PageCache:兜底大招,充当操作系统内存分配的桥梁 了解两大核心优化技术: 无锁化:线程本地缓存避免竞争 碎片管理:通过Span合并/分割减少内存浪费 虽然是mini版,但完整保留了TCMalloc的设计思想

2302_80475369的博客 1347

TCMalloc后端架构:Legacy PageHeap与HugePage Aware Allocator详解

TCMalloc作为高性能的内存分配器,其后端架构设计对系统性能有着决定性影响。本文将深入解析TCMalloc的两大后端分配器:传统的Legacy PageHeap和现代的大页感知分配器(HugePage Aware Allocator),帮助开发者理解内存分配的内部机制和优化策略。🚀 ## TCMalloc整体架构概述 TCMalloc采用三层架构设计,将内存分配流程分为前端、中端和后端,

gitblog_01035的博客 693

内存分配器ptmalloc2、tcmalloc、jemalloc,结构设计、内存分配过程详解

当用户请求的内存略小于某个空闲块时,分割后剩余的碎片会被标记为。

2402_82689232的博客 1572

终极指南:如何利用Google TCMalloc提升C++应用性能——从入门到精通

Google TCMalloc(Thread-Caching Malloc)是一款由Google开发的高效内存分配器,专为多线程C++应用设计,能显著提升内存分配速度并减少内存碎片。作为开源项目的重要组成部分,TCMalloc已被广泛应用于Chrome、TensorFlow等大型系统中,是提升应用性能的关键工具。 ## 🚀 TCMalloc核心优势解析 TCMalloc之所以能成为高性能应用

gitblog_00058的博客 622

深入理解 C++ 内存分配器:mimalloc、tcmalloc、jemalloc 详解(附使用示例与智能指针实践)

本文深入探讨了C++中三种主流内存分配器(mimalloc、tcmalloc、jemalloc)的工作原理与使用场景。内存分配器对程序性能影响巨大(可达10%-50%),尤其在高并发、长时间运行的服务中。文章比较了各分配器的特点:tcmalloc强于多线程性能,jemalloc擅长内存碎片管理,而微软的mimalloc则在速度、碎片率和跨平台支持上表现优异。文章还提供了具体的使用示例,并说明如何与智能指针配合使用。最后强调,即使是现代C++的智能指针,底层仍依赖高效的内存分配器实现最佳性能。开发者应根据应用

编程改变世界。想做一些改变世界的产品。感谢一键三连。 256

tcmalloc

引用链接:http://blog.csdn.net/chen19870707/article/details/40301783 TCMalloc:线程缓冲的Malloc:http://blog.csdn.net/chen19870707/article/details/40039401 使用TCMalloc的堆栈检查:http://blog.csdn.net/chen19870707/a...

weixin_30791095的博客 105

终极指南:如何用TCMalloc Guarded Page Allocator零成本提升内存安全

在现代软件开发中,内存安全问题一直是悬在开发者头上的达摩克利斯之剑。使用后释放、缓冲区溢出这些常见的内存错误,轻则导致程序崩溃,重则成为安全漏洞的温床。今天,我要介绍一个能够**在生产环境中实时检测内存错误**的强大工具——TCMalloc Guarded Page Allocator(GWP-ASan),它能够以几乎零性能开销的方式,为你的应用程序提供专业级的内存安全防护。🚀 ## 什么是内

gitblog_00746的博客 881

新时代内存分配器:TCMalloc

TCMalloc 全称 Thread-Caching Malloc,即线程缓存的 `malloc`,实现了高效的多线程内存管理,用于替代系统的内存分配相关的函数(`malloc`、`free`,`new`,`new[]` 等)。

凌桓丶的博客 2259

高并发内存池——基于Google开源项目tcmalloc的简洁实现

从零实现一个高并发内存池1. 初识高并发内存池1.1 项目介绍1.2 项目所需的知识1.3 了解池化技术1.4 内存池主要解决的问题2. 小试牛刀--设计一个定长内存池2.1 将内存还给定长内存池2.2 向定长内存池中申请内存3. 高并发内存池整体框架设计4. 梳理向内存池中申请内存的步骤4.1 哈希表与内存对齐4.2 ThreadCache结构分析与申请内存流程4.3 CentralCache结构分析与申请内存流程4.3.1 CentralCache结构分析(承上启下,非常关键)4.3.2 Central

m0_52751535的博客 3301

高并发内存池-TCMalloc

当前项目是实现一个高并发的内存池,它的原型是google的一个开源项目tcmalloc,全称Thread-Caching Malloc,即线程缓存的malloc,实现了高效的多线程管理,用于替代系统的内存分配函数(malloc、free)我们这个项目式简化了之后的,模拟实现一个自己的高并发内存池,目的是学习tcmallco的精华,这种方式类似STL容器的学习,但是相比STL,代码量和复杂度都上升了很多,要有心里准备。

qq_43422358的博客 1883

tcmallocgoogle开源项目核心部分模拟实现)

tcmalloc

qq_54198669的博客 2134

高并发内存池--tcmalloc

tcmallocGoogle开源项目,全称thread caching,即线程缓存的malloc,实现了高效的多线程内存管理,用于替代系统的内存分配相关函数

moran114的博客 1131

TCMalloc(Thread-Caching malloc) 基本设计原理

tcmalloc 拥有高并发场景的内存分配高性能 以及 较高的内存利用率

天行健,地势坤 3051
上一篇: go语言中的Map
帅过吴彦祖
博客等级 码龄9年 4粉丝 52原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值