【形象解析】ptmalloc、tcmalloc与jemalloc对比

ptmalloc源码剖析 ptmalloc内存管理器 ptmalloc是glibc默认的内存管理器。我们常用的malloc和free就是由ptmalloc内存管理器提供的基础内存分配函数。ptmalloc有点像我们自己写的内存池,当我们通过malloc或者free函数来申请和释放内存的时候,ptmalloc会将这些内存管理起来,并且通过一些策略来判断是否需要回收给操作系统。这样做的最大好处就是:让用户申请内存和释放内存的... 阅读详情
AI摘要

本文从新手角度出发,通过形象举例对比ptmalloc、tcmalloc与jemalloc三个常见内存池。先介绍内存池及池化技术,再分别解析三者的核心概念、内存申请与释放过程、优缺点,最后从线程本地缓存、碎片化管理、并发性能等方面进行综合对比,并给出适用场景。

前言

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

一、内存池

1)池化技术

池化技术是指将一类资源统一管理并重复利用,以减少资源分配和释放的频率,从而提升效率并降低系统开销。在内存管理中,池化技术主要用于小对象的内存分配,通过预先分配一块较大的内存区域,将其划分为多个固定大小的小块以满足频繁的内存请求。池化技术的核心思想是“重用”,尤其在那些内存分配和释放非常频繁的应用中,这种技术能够显著提高性能。

池化技术就像餐馆里的自助餐盘回收机制。想象一个高峰时段的餐馆,如果每次客人用餐后都需要餐馆去购买新的餐盘,显然效率会非常低,还会浪费资源。为了避免这种情况,餐馆会准备一批固定数量的餐盘,当客人用完后,服务员会清洗并重新放回取餐区域供下一个客人使用。这种重复利用餐盘的方式,不仅节省了资源,还让整个用餐流程更加高效。

在内存管理中,池化技术就像这些餐盘:系统预先准备了一批内存块,程序用完后会将它们归还,供后续的内存请求使用,从而避免频繁向操作系统申请和释放内存所带来的开销与混乱。

池化的优点包括:

  • 减少分配开销:减少调用操作系统的内存分配接口(如 malloc 或 new)的次数。
  • 提升性能:固定大小的内存块分配更快,同时避免碎片化问题。
  • 降低内存碎片:通过统一管理,池化技术更容易控制和优化内存布局。

典型应用场景包括网络编程中的连接池、线程池,以及游戏开发中的对象池等。

2)内存池

内存池是一种基于池化技术实现的内存管理机制,它通过预分配一块内存区域,并对其进行统一管理,为小对象的内存分配提供支持。内存池通常会按照特定规则将内存分为多个固定大小的块(或称为“单元”),并在需要时将这些块分配给用户,释放时再归还到内存池中以供后续使用。

内存池的核心在于复用已分配的内存块,而不是频繁向操作系统请求和释放内存。这样可以显著降低系统调用的开销,同时避免因频繁分配和释放而导致的内存碎片问题。

1. 内存池的基本原理与目标
  • 预分配内存

    • 内存池在初始化时一次性向操作系统申请一大块连续的内存区域。
    • 这块区域被划分为若干个大小一致的内存块,以支持频繁的小对象分配需求。
  • 内存管理策略

    • 空闲链表:内存池会维护一个空闲链表,用于记录所有未被分配的内存块。当有新的分配请求时,从链表中取出一个空闲块并返回;释放时再将其归还到链表中。

    • 分区分配:有些内存池实现会根据块大小将内存池划分为不同的区域,以适配不同大小的对象分配需求。

  • 减少系统调用

    • 通过复用内存块,内存池可以减少对操作系统的内存分配和释放调用(如 malloc 和 free),降低了系统调用带来的开销。
  • 目标

    • 提升效率:提供更快的内存分配和释放速度。

    • 减少碎片:通过固定大小块的分配,避免内存碎片问题。

    • 优化资源利用率:内存池可以帮助应用程序在高并发场景中高效管理内存,减少内存不足的问题。

2. 内存池设计考虑

为了实现一个高效的内存池,在设计中需要考虑以下关键因素:

  • 分配效率:如何快速找到一个可用的内存块?是否需要支持多线程并发分配?

  • 内存利用率:设计合理的块大小,以避免因分配过多大块内存而浪费资源。

  • 线程安全:是否需要对内存池进行线程同步,或者采用线程本地池来减少锁争用?

  • 可扩展性:如果内存池的预分配区域不够,是否支持动态扩展?如何回收不再使用的内存块?

  • 内存对齐:确保分配的内存满足平台对齐要求,避免因未对齐导致的性能问题或错误。

  • 内存生命周期管理:如何确保分配的内存块在释放时被正确归还?是否需要垃圾回收机制?

  • 定位错误:为了调试方便,内存池应提供检测非法访问或重复释放的机制。

  • 跨平台支持:内存池的实现应尽可能适配多种操作系统和硬件架构。

  • 内存监控:提供内存池的使用统计(如分配次数、空闲块数量)以方便调试和优化。

二、ptmalloc

1)介绍

20 世纪 90 年代,随着多核处理器和多线程编程模型的普及,传统的内存分配器(如 dlmalloc)因其单线程设计,在并发场景中表现不佳,特别是在多线程程序频繁调用 malloc 和 free 时,容易导致锁争用,进而成为性能瓶颈。

为了应对这一问题,ptmalloc(pthread malloc)应运而生。它在 dlmalloc 的基础上进行了优化,通过引入线程局部内存管理策略,减少了全局锁的竞争,从而提升了多线程环境下的内存分配效率。

具体来讲,ptmalloc 是由 Wolfgang Gloger 在 1997 年开发的基于 dlmalloc(Doug Lea Malloc)的改进版本,专为解决多线程环境中的内存分配问题。随着多线程和多核处理器的普及,传统的单线程内存分配器(如 dlmalloc)在并发场景下效率较低,尤其在频繁调用 malloc 和 free 时容易发生锁争用,影响性能。ptmalloc 基于 dlmalloc,通过引入多线程支持的 arena 机制,显著优化了并发环境中的内存分配效率。

可以把 ptmalloc 的改进形象地看成一个大型自助餐厅的服务流程优化:

在传统的餐厅(类似于 dlmalloc)中,每次客人(线程)需要用餐时,都必须到服务台排队领取食物(获取内存)(类似于调用 malloc)。如果餐厅很忙,所有客人都集中到一个服务台,就会造成拥堵(即锁争用),影响用餐效率。

而在改进后的餐厅(类似于 ptmalloc)中,餐厅经理(ptmalloc 的设计者)决定把食物分散到不同的区域,每个区域都有一套独立的自助食物领取站(arena)。每位客人按照就近的规则到自主食物领取站获取食物,不需要再排队到服务台,只有在一个领取站食物完全消耗,才会需要经理协调重新补充(对应极少的全局锁操作)。

这种改进的好处是:

  • 每个区域的服务都是独立的(即一个arena有一把锁,如果不向同一个arena索要内存就不会加锁),不会互相干扰。
  • 减少了集中管理带来的排队和等待(全局锁争用),提升了整体效率。
  • 适合高峰期使用(多线程高并发场景)。

通过这种优化,ptmalloc 在多线程环境下的内存分配性能得到了显著提升,就像改进后的餐厅能更高效地服务客人一样。

2)ptmalloc解析

1. 核心概念

了解ptmalloc前我们要明白两个核心概念:

  • Arena(分配区):每个线程会优先使用自己的分配区,减少与其他线程的锁竞争。如果没有可用的分配区,系统会动态创建新的分配区。

  • Chunk(内存块):指内存池中分配的最小单位,每次内存申请都会从Arena分配区中切割出适合大小的内存块返回给用户。对于超大内存申请,直接调用操作系统的 mmap 接口分配内存。

2. 线程与分配器的关系

ptmalloc 通过 动态创建多个 arena 来应对多线程的内存分

TCMalloc详解 TCMalloc详解TCMalloc虚拟内存TCMalloc架构TCMalloc Front-endPer-thread模式Front-end缓存运行时大小小对象和大对象分配Middle-endTransfer CacheCentral Free listPagemap 和 Spans在`spans`中存储小内存对象TCMalloc Page SizesTCMalloc Back-endLegacy PageheapTCMalloc详细架构图 本文部分内容是结合参考其他文章已经tcmalloc官方文档。 T 阅读详情

相关推荐

Linux内存管理(四):Jemalloc

1. Jemalloc简介 jemalloc 是由 Jason Evans 在 FreeBSD 项目中引入的新一代内存分配器。它是一个通用的 malloc 实现,侧重于减少内存碎片和提升高并发场景下内存的分配效率,其目标是能够替代 malloc。jemalloc 应用十分广泛,在 Firefox、Redis、Rust、Netty 等出名的产品或者编程语言中都有大量使用。具体细节可以参考 Jason Evans 发表的论文 《A Scalable Concurrent malloc Implemen...

蓬莱道人的博客 1万+

ptmalloc、tcmalloc与jemalloc对比分析

ptmalloc、tcmalloc与jemalloc对比分析。

喜欢打篮球的普通人 2164

malloc的底层实现(ptmalloc)

前言   本文主要介绍了ptmalloc对于内存分配的管理。结合网上的一些文章和个人的理解,对ptmalloc的实现原理做一些总结。 内存布局   介绍ptmalloc之前,我们先了解一下内存布局,以x86的32位系统为例:      从上图可以看到,栈至顶向下扩展,堆至底向上扩展, mmap 映射区域至顶向下扩展。 mmap 映射区域和堆相对扩展,直至耗尽虚拟地址空间中的剩余区域,...

编程随笔与杂谈 3万+

高性能内存分配器 jemalloc 基本原理

文章目录背景知识常用内存分配器算法动态内存分配伙伴算法Slab 算法jemalloc 架构设计 在上一篇文章中,我们介绍了强大的 ByteBuf 工具类,ByteBuf 在 Netty 中随处可见,那么这些 ByteBuf 在 Netty 中是如何被分配和管理的呢?接下来的我们会对 Netty 高性能内存管理进行剖析,这些知识相比前面的章节有些晦涩难懂,你不必过于担心,Netty 内存管理的实现并不是一蹴而就的,它也是参考了 jemalloc 内存分配器。今天我们就先介绍 jemalloc 内存分配器的基本

2282

Flutter模块打包AAR集成Android原生项目实践

跨平台开发框架Flutter通过将UI组件渲染为原生代码实现高性能表现,其核心优势在于一套代码可同时运行在iOS和Android平台。在工程实践中,将Flutter模块打包为AAR(Android Archive)进行集成,成为混合开发的主流方案。这种方案既保留了原生项目的稳定性,又能渐进式引入Flutter的高效开发特性。通过配置MethodChannel实现原生与Dart代码通信,开发者可以灵活控制Flutter引擎生命周期,优化内存占用和渲染性能。对于电商、社交等需要快速迭代的业务场景,该方案能显著提

weixin_34025051的博客 399

手把手教你用Simulink搭建DSOGI-PLL模型(附完整代码下载)

本文详细介绍了在Simulink中搭建高鲁棒性DSOGI-PLL模型的完整工程实践指南。针对传统锁相环在非理想电网下的不足,文章深入剖析了双二阶广义积分器锁相环(DSOGI-PLL)的核心原理与优势,并提供了从模块构建、系统组装到参数整定与测试验证的全流程手把手教程,附有完整代码下载,助力工程师应对谐波、电压跌落等复杂电网工况。

weixin_29223603的博客 389

C#上位机实战:工业产线数据采集与监控系统开发(附源码思路)

模块化设计:四层架构清晰,各模块独立可替换,便于后期维护与扩展;稳定性强:支持断线重连、异常重试、并发采集,满足工业7×24小时运行需求;实用性高:覆盖产线监控核心功能,可视化组件适配工业场景,操作简单;源码可复用:通信类、采集服务、报警管理器等可直接复制到其他上位机项目。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1655

置顶必读(1) | 《YOLOv26实战:从入门到深度优化》专栏导读与完整目录导航(持续更新中)

🏆 本文收录于 《YOLOv26实战:从入门到深度优化》 专栏。 本专栏系统梳理并持续复现 YOLOv26 官方特性、核心改进、多任务支持、部署优化与行业落地,内容坚持 持续更新 + 深度拆解 + 工程落地导向,不仅讲“怎么用”,更讲“为什么这样设计、如何真正落地到项目中”。

**My Coding Family** 9万+

Python爬虫实战:使用最新技术抓取采购网招标公告信息

本文将详细介绍如何使用Python最新爬虫技术构建一个高效的采购网招标公告信息抓取系统。我们将从爬虫基础概念讲起,逐步深入到高级技巧,包括异步处理、反爬虫对策、数据解析与存储等,并提供完整的代码实现。本文旨在为读者提供一套完整的网络数据采集解决方案,适用于各类政府采购平台和商业招标网站。网络爬虫(Web Crawler)是一种自动抓取互联网信息的程序或脚本,它们按照一定的规则,自动地浏览万维网并提取所需数据。在现代商业环境中,爬虫技术广泛应用于价格监控、竞争情报收集、市场研究等领域。

2201_76125261的博客 1623

YOLOv5算法改进(22)— 更换主干网络MobileNetv3 + 添加CA注意力机制

本节课就让我们结合论文来对YOLOv5进行组合改进(更换主干网络MobileNetv3 + 添加CA注意力机制),小白必学~!🌈

小哥谈 2818

YOLOv8【第十章:多任务扩展深度篇·第16节】车道线检测——基于 YOLOv8-Seg 的车道线分割与拟合!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 1万+

用 SAP CDS View 和 Fiori Elements 快速打造 CRM Service Order 应用──十分钟跑通从数据模型到上线的全流程

通过CDS 视图 + Fiori Elements的组合,我们得以在极短时间内把传统 CRM Service Order 场景迁移到现代化的 Fiori 界面,而且代码量极小、可维护性高。若后续需要离线能力,可考虑将同一 OData 服务暴露给 Mobile Services,再配合 MDK 或 UI5 Mobile Toolkit;若要支持复杂审批流,则可以在同一 Launchpad 内嵌入 Process Visibility Dashboard,实现端到端可视化。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 392

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: 【CPP】内存泄漏详解
下一篇: 【CPP】死锁产生、排查、避免
Raizeroko
博客等级 码龄6年 1913粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值