1.分层分配
层级 | 内容 |
---|---|
字典,元祖,列表,字符串.....等等python对象 | |
第3层 | 对象特有的内存分配器(比如聚合对象) |
第2层 | python对象分配器 |
第1层 | python低级内存分配器 |
第0层 | glibc的malloc |
第-1层 | 操作系统虚拟的内存管理器 |
第-2层 | 物理内存 |
2.第0层 glibc
- linux OS提供的glibc这种malloc()
- 申请的内存大于256K字节,会忠实调用第0层malloc;否则,转给第1层和第2层
- 第1层负责小于等于256K字节的短命对象
3.第1层:python低级内存分配器
- 三个级别的内存结构:
arena > pool > block
- arena大小固定为256K
- pool大小固定4K(与操作系统虚拟内存页大小一致)
- unusedarenaobjects单项链表;usable_arenas双向链表
- 生成和管理arena和pool
4.第2层:python对象分配器
- 负责管理pool内部的block
- block大小是8的整数倍,最小满足分配需求,会有个内存对齐,比如申请14字节,给你16字节
- block三种状态:已经分配,使用完毕,未使用
5.第3层:对象特有分配器
-
包含元组、列表、字典 自上而下要资源
请给我一个PyDictObject(字典对象)----->
PyDict_new()
---->请给我sizeof(PyDictObject)字节的block ------>PyObject_GC_New()、PyObject_Malloc()
---->请给我sizeof(PyDictObject)字节的pool---->usable_arenas-->freepools、 new_arena()
------>我想做一个arena,请给我256K直接的内存----->malloc()
自下而上返回资源
malloc()
----> 返回256K的内存,拿去花吧---->usable_arenas-->freepools、 new_arena()
------>做成arena,返回一个pool,拿去花吧---->PyObject_GC_New()、PyObject_Malloc()
----->返回pool中一个block,拿去花吧------>PyDict_new()
----->给你一个字典对象