加载中...
内存分配器是负责管理程序动态内存申请与释放的软件模块,位于应用与操作系统之间。它通过维护空闲内存块、减少系统调用次数和抑制碎片,高效地满足 malloc、free 等调用。

| 工作层 | 用户态运行时 |
| 核心接口 | malloc/free |
| 常见实现 | ptmalloc、tcmalloc、jemalloc |
| 优化目标 | 速度、碎片、并发 |
内存分配器是运行时库或操作系统中管理堆内存的组件,负责响应程序的动态内存申请与释放请求。它在向内核批发大块内存的基础上,再零售给应用的每一次小额分配,力求速度快、碎片少、并发友好。
程序调用 malloc 申请内存时,并不会每次都陷入内核。分配器通常通过 brk 或 mmap 一次性向操作系统索取较大的内存区域,然后在用户态自行切分和记账。这样既减少了昂贵的系统调用,又能复用已释放的空间。分配器的核心挑战在于既要快速定位合适大小的空闲块,又要控制内部碎片和外部碎片。
常见实现包括 glibc 的 ptmalloc、谷歌的 tcmalloc、FreeBSD 与 Firefox 使用的 jemalloc,以及面向嵌入式的轻量分配器。它们在多线程扩展性、内存占用和分配速度上各有取舍。
高并发服务器常替换默认分配器为 tcmalloc 或 jemalloc,以缓解多线程锁争用、降低延迟抖动;数据库和缓存系统对内存碎片敏感,倾向于选择碎片控制良好的分配器;嵌入式与实时系统则可能使用确定性更强的定制分配器,避免不可预测的停顿。
问:内存分配器和操作系统内存管理是一回事吗?答:不是。内核负责物理页与虚拟地址映射等底层管理,而内存分配器工作在用户态,把从内核获得的大块内存进一步细分给应用,二者分工协作。
问:释放的内存为什么没有立即还给系统?答:分配器通常把释放的块留在空闲链表中以便快速复用,只有满足一定条件时才归还内核,这减少了反复申请释放的开销,但也可能让进程占用看起来偏高。

| 工作层 | 用户态运行时 |
| 核心接口 | malloc/free |
| 常见实现 | ptmalloc、tcmalloc、jemalloc |
| 优化目标 | 速度、碎片、并发 |
登录 后参与讨论
暂无讨论,来发表第一条评论吧