内存管理器: ptmalloc vs tcmalloc vs jemalloc

内存管理器在程序设计中扮演着关键角色,负责分配、跟踪和释放程序运行时使用的内存。本文将对三种流行的内存管理器:ptmalloc、tcmalloc和jemalloc进行比较。

ptmalloc

概述

  • 来源:ptmalloc是GNU C库(glibc)中默认的内存管理器。
  • 设计基础:基于dlmalloc的变体,专为多线程环境优化。
  • 主要特点:使用线程局部存储减少锁的使用。
  • 适用场景:适合于通用的Linux应用程序。

重要数据结构

  • Heap Area:用于分配给单个线程的内存区域。
  • Free Lists:空闲块组成的链表。
  • Bins:组织不同大小空闲块的一组空闲列表。

tcmalloc

概述

  • 来源:由谷歌开发,是gperftools的一部分。
  • 设计基础:Thread-Caching Malloc,专注于多线程。
  • 主要特点:线程独立缓存,减少全局堆争用。
  • 适用场景:适合高性能、多线程、大规模内存使用的应用。

重要数据结构

  • Thread Caches:为每个线程提供的私有缓存。
  • Central Free List:全局共享的数据结构,按大小类(size class)管理小对象,为各线程缓存补充或回收对象。
  • PageHeap:管理大块内存分配。
  • Span:表示连续内存页的结构。

jemalloc

概述

  • 来源:最初为FreeBSD操作系统开发。
  • 设计基础:强调可伸缩性和碎片管理。
  • 主要特点:优秀的多线程性能和内存碎片管理。
  • 适用场景:适合内存密集型和对内存碎片化敏感的应用。

重要数据结构

  • Arenas:独立的内存区域,管理不同线程的内存分配。
  • Slab(4.x 及以前称为 Run):分配给特定小对象大小类的连续页。
  • Size Classes:预定义的对象大小集合。
  • Bins and Extents:Bins用于管理特定大小类对象的 slab,Extents(按页对齐、大小可变,4.x 及以前为 Chunks)为大块内存的分配单位。

每种内存管理器都有其优势和局限性,选择哪一个取决于具体的应用场景和性能要求。在某些情况下,更换内存管理器可以显著提升应用程序的性能。

请我喝杯咖啡