Python中的内存管理

python是一门解释性语言,由相应的虚拟机解释执行。Python有多种解释器,如CPython、IronPython、Jython以及PyPy。本文中讲述的内存管理均是基于CPython

CPython中对象的表示方法

我们知道,python中的一切都能看成是对象。在CPython中,我们通过结构体来表示对象。python中的每个对象都会使用CPython中的PyObject这个结构体。这个结构体由两个属性组成:

ob_refcnt: reference count  #引用计数,记录该对象被引用的次数
ob_tyoe: pointer to another type  #指向真实的对象,由于C语言不是面向对象语言,因此,实际指向的还是一个结构体

当对象的引用计数为0时,python就会回收这个对象,释放空间。

CPython中的内存管理

CPython中的内存按照大小可以分为Arenas、Pool和Block,Arenas包含Pool,Pool包含Block。

Arenas

Arenas本身没有状态,它通过一个双向链表进行维护。该双向链表会根据Arenas中空白Pool的多少对Arenas进行排序。空白Pool越少,排列越靠前,这样可以保证Arenas的充分利用。
图片侵权删

Pools

Pools由Blocks组成,每个Pool内的Block的大小是一定的,但不同的Pool内的Block的大小可以不同。每个Pool通过双向链表与其它具有相同大小的Block的Pool相连。
Pool本身有三种状态:used、full以及empty。一个used状态的pool只能存储指定大小的Block;一个full状态的pool无法再存储数据;一个empty状态的pool可以存储任意大小的Block。
usedpools是一个由相同Block大小的处于used状态的pool组成的列表,当处于full状态的pool释放掉部分Block后,这个pool也会进入到这个列表中等待被使用;freepools是由处于empty状态的pool组成的列表。

Blocks

Blocks有三种状态:untouched、free以及allocated。
untouched是指该Block没有被分配,free是指该Block分配后又被重新释放了,allocated是指该Block已经被分配,且还在使用中。
Pool中有freeblock指针,负责指向处于free状态的Block。如下图所示。
图片侵权删
注意,Block由allocated状态转到free状态,所占的内存并不会返还给操作系统,因为这只是一个状态的转变,告诉程序这个Block可以使用了而已,但是这个Block里面的东西还在

参考资料:https://realpython.com/python-memory-management/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值