区域 / 内存池分配Arena allocation
在一组内存块中推进游标分配对象,并按区域生命周期统一回收。
- 核心约束
- 对象有效期不得超过所属区域,分配游标需满足边界与对齐要求。
- 适用问题
- 请求、解析过程、编译阶段等生命周期相近的一批对象。
- 边界与取舍
- 不能假定任意对象可独立释放;存活期差异会导致内存滞留。
常见操作#
B 为区域中的内存块数,C 为清理回调数;以 nginx 1.26.3 内存池为例。
| 操作 | 时间成本 | 条件与说明 |
|---|---|---|
| 当前块内游标分配 | 对齐游标并前移,当前块有足够空间。 | |
| 寻找可用块 / 扩展区域 | 扫描块 + 上游分配成本 | nginx 可沿后续块寻找空间,不是所有分配都严格 。 |
| 销毁整个区域 | ,另计回调及释放工作 | 逐块释放并调用资源清理函数;区域中小对象通常不逐个释放。 |
时间与空间#
- 时间成本
- 命中当前块为 ,扩展与销毁另计
- 空间成本
- 已用对象 + 对齐 / 尾部浪费 + 区域元数据
适合共享生命周期的对象。个别对象已无用时,内存可能仍保留到区域整体释放。
工程中的应用#
1 个案例 · 附源码nginx 将小额分配变成池内游标推进,并以池的生命周期统一释放;较大的分配另建记录管理。
附源码片段 · 内存管理
基础原理参考资料
nginx 1.26.3 · ngx_palloc.cngx_palloc_small 的块内分配和 ngx_destroy_pool 的整体清理。