【操作系统百科】用户态分配器

💡 原文中文,约4600字,阅读约需11分钟。
📝

内容提要

文章讨论了四种内存分配器:glibc ptmalloc2、Google tcmalloc、Facebook jemalloc和Microsoft mimalloc。每种分配器有不同的设计哲学和优缺点。ptmalloc2适合标准用途,tcmalloc优化多线程性能,jemalloc注重碎片控制,而mimalloc追求极致性能。文章还提到内存碎片和RSS膨胀的问题,并提供调优建议。选择合适的分配器可以提高性能和内存管理效率。

🎯

关键要点

  • 内核提供 mmap/brk,用户态分配器管理堆,主要有四种:glibc ptmalloc2、Google tcmalloc、Facebook jemalloc 和 Microsoft mimalloc。
  • glibc ptmalloc2 适合标准用途,但存在多线程锁争抢和内存碎片化问题。
  • Google tcmalloc 优化多线程性能,使用每线程缓存消除锁争抢,碎片控制良好。
  • Facebook jemalloc 注重碎片控制,采用多 arena 和细粒度 size class,积极返还内存。
  • Microsoft mimalloc 追求极致性能,采用简单的 per-thread page 管理,低碎片率。
  • MADV_FREE 和 MADV_DONTNEED 是分配器返还内存给 OS 的两种方式,影响内存管理效率。
  • 内存碎片和 RSS 膨胀是常见问题,可能导致进程 RSS 远大于活跃堆大小。
  • 选择合适的内存分配器可以提高性能和内存管理效率,推荐使用 jemalloc 或 tcmalloc。

延伸问答

用户态分配器有哪些主要类型?

主要有四种:glibc ptmalloc2、Google tcmalloc、Facebook jemalloc 和 Microsoft mimalloc。

tcmalloc 的设计哲学是什么?

tcmalloc 通过每线程缓存消除锁争抢,优化多线程性能,并且碎片控制良好。

jemalloc 如何控制内存碎片?

jemalloc 采用多 arena 和细粒度 size class,积极返还内存以控制碎片。

mimalloc 的主要特点是什么?

mimalloc 追求极致性能,采用简单的 per-thread page 管理,具有低碎片率和快速的对象分配。

如何选择合适的内存分配器?

推荐使用 jemalloc 或 tcmalloc,具体选择取决于应用场景,如通用 Linux 服务、Google 生态等。

内存碎片和 RSS 膨胀的原因是什么?

内存碎片和 RSS 膨胀的原因包括内部碎片、外部碎片和分配器未及时返还内存。

➡️

继续阅读