python内存管理--分层分配

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()----->给你一个字典对象

你可能感兴趣的:(python)