【操作系统百科】用户态分配器
💡
原文中文,约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 膨胀的原因包括内部碎片、外部碎片和分配器未及时返还内存。
➡️