Python 内存管理机制——内存模型 | 村里最好的博客
Python 中的内存管理 | zikcheng
- 如果没有可用的 arena 就重新申请一个
- 从可用的 arena 中分配一个新的 pool
- 从分配的 pool 中分配空闲的 block
- 计算地址 p 所在 pool 首地址,前文介绍过每个 pool 首地址都是 POOL_SIZE 的整数倍,所以将 p 的低位置 0 就得到了 pool 的地址
- address_in_range(p, pool) 判断 p 是否是由 pool 分配的,如果不是直接返回
- 将 p 指向的 block 释放掉,被
pool->freeblock 回收 - 如果 pool 开始为 full 状态,那么回收 block 之后就是 used 状态,调用函数
insert_to_usedpool(pool) 将其置为 usedpools[size+size] 的头结点。这里的策略跟 usable_arenas 一样,优先使用快满的 pool,让比较空闲的 pool 有较高的概率被释放掉。 - 如果 pool 回收 block 之后变成 empty 状态,需要调用
insert_to_freepool(pool) 将 pool 也释放掉