内存管理
Python 的内存管理
参考:B站 码农高天
本文假定 CPython。
以下只是内存管理系统的一个层级(概念模型),不代表其具体实现。
目的
为什么需要自己的内存管理系统?因为 Python 在允许过程中会建立大量小的 objects,
High-Level 角度
层级
Python 的内存管理分为三层:Block, Pool, Arena,其中 block 就是一块小的连续内存,直接存储了对应数据,pool 则储存了大量内存相同的 blocks,不同的 pool 储存的 block 的大小可能不同,因此其 size 也不同,arena 储存了大量的 pool。
block 的大小是 8 的倍数,pool 的大小是 4 KB(与内存页一样大),arena 的大小则是 256 KB。
内存对齐与 usedpools
Python block 的大小永远是 8 的倍数。申请内存不是 8 的倍数时,Python 会先做内存对齐,找到大于该数的第一个 8 的倍数。例如申请 13 B 的内存时,会将数据存储在 16 B 的block 内。
这样做的好处是减少内存的碎片化,有助于速度的提升。
由于每个 pool 保存相同大小的 blocks,所以每个 pool 也都有一个 size 变量,标识了这个 pool 里面 block 的大小。
Python 还有一个 usedpools 工具,它是一个数组保存了指向各个大小的 pool 的指针,其 index 0 的位置指向 size 为 8 的 pool,1 指向 16,2 指向 24……一般地,i 就指向 8(i + 1) 的 pool
动态内存
Python 向操作系统申请和退还内存时,都是以 arena 为层级进行的。
实际申请
申请时,对于小于等于 512 B 的内存,Python 使用自己的内存管理系统;对于大于 512 B 的内存,Python 会调用 C 的 malloc 函数,向操作系统直接申请堆内存。
读完了,有什么想法?
阅读已保存的问答示例,并循着引用回到原文。