区域 / 内存池分配Arena allocation

在一组内存块中推进游标分配对象,并按区域生命周期统一回收。

核心约束
对象有效期不得超过所属区域,分配游标需满足边界与对齐要求。
适用问题
请求、解析过程、编译阶段等生命周期相近的一批对象。
边界与取舍
不能假定任意对象可独立释放;存活期差异会导致内存滞留。
block Ablock Busedfreerelease pool
在块内推进分配游标,空间不足时扩展;区域结束后统一清理,块内小对象不能任意单独释放。

常见操作#

B 为区域中的内存块数,C 为清理回调数;以 nginx 1.26.3 内存池为例。

操作时间成本条件与说明
当前块内游标分配O(1)O(1)对齐游标并前移,当前块有足够空间。
寻找可用块 / 扩展区域扫描块 + 上游分配成本nginx 可沿后续块寻找空间,不是所有分配都严格 O(1)O(1)。
销毁整个区域O(B+C)O(B+C),另计回调及释放工作逐块释放并调用资源清理函数;区域中小对象通常不逐个释放。

时间与空间#

时间成本
命中当前块为 O(1)O(1),扩展与销毁另计
空间成本
已用对象 + 对齐 / 尾部浪费 + 区域元数据

适合共享生命周期的对象。个别对象已无用时,内存可能仍保留到区域整体释放。

工程中的应用#

1 个案例 · 附源码
基础原理参考资料

nginx 1.26.3 · ngx_palloc.cngx_palloc_small 的块内分配和 ngx_destroy_pool 的整体清理。

4 个概念