021-TCMalloc

TCMalloc

以下是对TCMalloc的技术调研报告,结合原理、代码实现、优化参数及性能对比的综合分析:

一、TCMalloc核心原理

  1. 架构分层
  • TCMalloc采用三级缓存结构,具体流程参考下图:
┌─────────────┐       ┌─────────────┐       ┌─────────────┐ 
│ ThreadCache │──────▶│ CentralHeap │──────▶│  PageHeap   │ 
└─────────────┘       └─────────────┘       └─────────────┘ 
(线程本地缓存)        (全局中央堆)         (系统内存管理)
  • ThreadCache:每个线程独立的小对象缓存(<32KB),无锁操作。
  • CentralHeap:全局共享的中型对象缓存(32KB~256KB),需自旋锁保护。
  • PageHeap:大对象(≥256KB)直接通过mmap分配,按页管理(默认8KB/页)。
  1. 内存管理单元
  • Span:连续内存页的抽象(1~256页),用于记录内存块的分配状态。
struct Span {PageID start_page;  // 起始页号 size_t num_pages;   // 页数量 Span* next;         // 链表指针 SizeClass size_class; // 小对象类型 
};

SizeClass:将小对象划分为88种规格(8B~256KB),对齐策略减少碎片。
3. 分配流程

graph TD 
A[分配请求] --> B{对象大小}
B -->|≤32KB| C[ThreadCache]
B -->|>32KB| D[CentralHeap/PageHeap]
C --> E{本地空闲链}
E -->|存在| F[直接分配]
E -->|不存在| G[从CentralHeap补充]
G --> H[拆解Span为小对象]

二、关键代码实现

  1. 核心数据结构
// ThreadCache定义(简化版)
class ThreadCache {FreeList list_[kNumClasses]; // 按size class组织的空闲链表 void* Allocate(size_t size);void Deallocate(void* ptr);
};// CentralHeap中的CentralFreeList 
class CentralFreeList {SpinLock lock_;SpanList nonempty_; // 非空Span链表 SpanList empty_;    // 空Span链表 
};
  1. 分配器入口(Hooking malloc)
extern "C" void* tc_malloc(size_t size) {if (size > kMaxSmallSize) {return pageheap->AllocLarge(size);}SizeClass cl = SizeClasser::Classify(size);return thread_cache.Get()->Allocate(cl);
}

三、优化参数配置

通过环境变量调整性能(需在程序启动前设置):

  • 限制线程缓存总大小(默认64MB)
export TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES=134217728 
  • 内存释放频率(0=不主动释放,1=积极释放)
export TCMALLOC_RELEASE_RATE=0.5 
  • 大对象阈值(默认256KB)
export TCMALLOC_LARGE_ALLOC_REPORT_THRESHOLD=1048576 

完整参数列表可参考Google官方文档 。

四、性能Benchmark对比

  1. 测试代码
#include <benchmark/benchmark.h>
#include <vector>static void BM_Malloc(benchmark::State& state) {for (auto _ : state) {void* p = malloc(state.range(0)); free(p);}
}
BENCHMARK(BM_Malloc)->Arg(64)->Arg(4096)->Arg(1<<20);static void BM_TCMalloc(benchmark::State& state) {for (auto _ : state) {void* p = tc_malloc(state.range(0)); tc_free(p);}
}
BENCHMARK(BM_TCMalloc)->Arg(64)->Arg(4096)->Arg(1<<20);BENCHMARK_MAIN();
  1. 测试结果(单位:ns/op)
分配大小mallocTCMalloc提升比例
64B421564%↑
4KB853262%↑
1MB5204808%↑

数据表明小对象分配性能提升显著。

五、应用建议

  • 适用场景:高频小对象分配(网络协议栈、消息队列)、多线程服务。
  • 陷阱规避:
    避免混合使用不同分配器(如同时链接tcmalloc和jemalloc)
    定期调用MallocExtension::ReleaseFreeMemory()释放闲置内存
  • 监控工具:
MallocExtension::GetInstance()->GetStats(buffer, buffer_size); // 获取内存状态 

完整代码

Github

作者郑天佐
邮箱zhengtianzuo06@163.com
主页http://www.zhengtianzuo.com
githubhttps://github.com/zhengtianzuo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/37491.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为网路设备学习-16 虚拟路由器冗余协议(VRRP)

VRRP是针对干线上三层网络设备&#xff08;如&#xff1a;路由器、防火墙等&#xff09;的网络虚拟化技术&#xff0c;提供冗余和状态监测等功能。确保在网络中的单点故障发生时&#xff0c;能够快速切换到备份设备&#xff0c;从而保证网络通信的连续性和可靠性。‌ VRRP通过…

【华为Pura先锋盛典】华为Pura X“阔折叠”手机发布:首次全面搭载HarmonyOS 5

文章目录 前言一、阔感体验&#xff0c;大有不同二、鸿蒙AI&#xff0c;大有智慧三、便携出行&#xff0c;大有不同四、首款全面搭载 HarmonyOS 5 的手机五、卓越性能&#xff0c;可靠安心六、红枫影像&#xff0c;大放光彩预热&#xff1a;鸿蒙电脑HarmonyOS 5 升级计划小结 前…

算法题(103):数独

审题&#xff1a; 本题需要我们找出数独的解&#xff0c;并打印出来 时间复杂度分析&#xff1a; 本题是9*9的数独格子&#xff0c;所以数据量小于25&#xff0c;可以使用2^n的算法 思路&#xff1a; 方法一&#xff1a;深度优先搜索 首先确定搜索及插入策略&#xff1a; 我们采…

sougou AI close

sougou AI close 全局禁用《AI 汪仔》 现在丝滑流畅很多了

二分查找上下界问题的思考

背景 最近在做力扣hot100中的二分查找题目时&#xff0c;发现很多题目都用到了二分查找的变种问题&#xff0c;即二分查找上下界问题&#xff0c;例如以下题目&#xff1a; 35. 搜索插入位置 74. 搜索二维矩阵 34. 在排序数组中查找元素的第一个和最后一个位置 它们不同于查找…

springboot实现调用百度ocr实现身份识别+二要素校验

一、技术选型 OCR服务&#xff1a;推荐使用百度AI 二、实现 1.注册一个服务 百度智能云控制台https://console.bce.baidu.com/ai-engine/ocr/overview/index?_1742309417611 填写完之后可以获取到app-id、apiKey、SecretKey这三个后面文件配置会用到 2、导入依赖 <!-- …

【数据分享】2000—2024年我国乡镇的逐月归一化植被指数(NDVI)数据(Shp/Excel格式)

之前我们分享过2000—2024年我国省市县三级逐月归一化植被指数&#xff08;NDVI&#xff09;数据&#xff0c;该数据是基于NASA定期发布的MOD13A3数据集中的月度NDVI栅格数据&#xff08;可查看之前的文章获悉详情&#xff09;计算得出。很多小伙伴拿到数据后反馈是否可以处理出…

背包问题——动态规划的经典问题包括01背包问题和完全背包问题

01背包问题&#xff1a;给你多个物品每个物品只能选一次&#xff0c;要你在不超过背包容积&#xff08;或者恰好等于&#xff09;的情况下选择装价值最大的组合。如果没有动态规划的基础其实是很难理解这个问题的&#xff0c;所以看这篇文章之前先去学习一下动态规划的基本思想…

AI Agent系列(七) -思维链(Chain of Thought,CoT)

AI Agent系列【七】 前言一、CoT技术详解1.1 CoT组成1.2 CoT的特点 二、CoT的作用三、CoT的好处四、CoT适用场景五、CoT的推理结构 前言 思维链(Chain of Thought,CoT)&#xff0c;思维链就是一系列中间的推理步骤(a series of intermediate reasoning steps)&#xff0c;通过…

Docker搭建Testlink教程

1.拉取镜像 打开终端输入命令&#xff1a; #拉取mariadb镜像 docker pull bitnami/mariadb #拉取testlink镜像 docker pull bitnami/testlink-archived 执行结果&#xff1a; 2.运行容器 打开终端输入命令&#xff1a; #创建容器网络 docker network create testlink #查…

考研c语言复习之栈

栈一般出选择题&#xff0c;队列选择题和大题都有 栈&#xff1a;只允许在一端 进行插入或删除操作的线性表即栈顶&#xff08;top) s.top-1时栈为空 向栈中插入元素 s.tops.top1;s.data[s.top]value; 这段代码可以用一行代码代替&#xff1a; s.data[s.top]value; 不懂i和…

C#里使用libxl来合并单元格的例子

操作EXCEL的文件格式是常用的功能&#xff0c; 通过不同的单元格的合并&#xff0c;可以生成不同的表格。 如下图所示&#xff1a; 采用libxl来创建上面的EXCEL&#xff0c;使用下面的代码来实现&#xff1a; private void button8_Click(object sender, EventArgs e) {var …

大屏技术汇集【目录】

Cesium 自从首次发布以来&#xff0c;经历了多个版本的迭代和更新&#xff0c;每个版本都带来了性能改进、新功能添加以及对现有功能的优化。以下是 Cesium 一些重要版本及其主要特点&#xff1a; 主要版本概述 Cesium 1.0 (2012年) 初始版本发布&#xff0c;确立了Cesium作为…

《深度学习》——YOLOv3详解

文章目录 YOLOv3简介YOLOv3核心原理YOLOv3改进YOLOv3网络结构 YOLOv3简介 YOLOv3&#xff08;You Only Look Once, version 3&#xff09;是一种先进的实时目标检测算法&#xff0c;由 Joseph Redmon 和 Ali Farhadi 开发。它在目标检测领域表现出色&#xff0c;具有速度快、精…

websocket中spring注入失效

一个null指针引发的思考 websocket中spring注入失效 一个null指针引发的思考场景代码SpringBoot入口类配置类websocket类 问题排查问题1&#xff1a;问题2&#xff1a; 反思解决方案一&#xff1a;方案二&#xff1a;方案三&#xff1a;方案四&#xff1a; 场景 首页有个webso…

QT开发(4)--各种方式实现HelloWorld

目录 1. 编辑框实现 2. 按钮实现 前面已经写过通过标签实现的了&#xff0c;所以这里就不写了&#xff0c;通过这两个例子&#xff0c;其他的也是同理 1. 编辑框实现 编辑框分为单行编辑框&#xff08;QLineEdit&#xff09;双行编辑框&#xff08;QTextEdit&#xff09;&am…

自由学习记录(45)

顶点片元着色器&#xff08;important&#xff09; 1.需要在Pass渲染通道中编写着色器逻辑 2.可以使用cG或HLSL两种shader语言去编写Shader逻辑 3.代码量较多&#xff0c;灵活性较强&#xff0c;性能消耗更可控&#xff0c;可以实现更多渲染细节 4.适用于光照处理较少&#xf…

内存管理(C++篇)

前言 我们在C语言阶段学习过内存管理的相关操作和知识&#xff0c;比如说malloc&#xff0c;calloc等内存开辟函数&#xff0c;但我们在学的时候会发现&#xff0c;使用这些函数还是相对来说比较冗杂的&#xff0c;那么今天我们来学习C语言中相关的内存管理操作&#xff0c;相信…

母婴电商企业案例:日事清驱动项目管理执行与OKR目标管理的流程自动化实践

一、关于科木电商 “小鹿豆豆”&#xff0c;一个年轻的品牌&#xff0c;近期在无论是淘宝、拼多多还是抖音电商平台&#xff0c;都成了亮眼的爆品。这个由绵阳科木电子商务有限公司推出的新品牌&#xff0c;以其高品质的保湿云柔巾迅速赢得了母婴护理市场的青睐&#xff0c;特别…

图数据库Neo4j和JDK安装与配置教程(超详细)

目录 前言 一、Java环境配置 &#xff08;一&#xff09;JDK的下载与安装 &#xff08;二&#xff09;JDK环境配置 &#xff08;三&#xff09;检测JDK17是否配置成功 二、Neo4j的安装与配置 &#xff08;一&#xff09;Neo4j的下载与安装 &#xff08;二&#xff09;N…