Python的垃圾回收机制

Garbage Collection

  1. 小整数对象池
    Python中为了避免为整数频繁申请和销毁内存空间,Python对小整数[-5,257)这些整数对象是提前创建好的,不会被垃圾回收。在一个Python程序中,所有位于这个返回内的整数使用的都是同一个对象。
    同理,单个字母也是如此。对于超过这个数值大小的数字就单独创建一个地址。
    在这里插入图片描述

  2. intern机制
    如果多个变量同时指向同一个str对象,相应的str类型的内存会常驻
    s

  3. Python中的引用计数机制

typedef struct_object{
	int ob_refcnt;
	struct_typeobject * ob_type;
}PyObject;

创建一个结构体,维护一个计数索引ob_refcnt,如果ob_refcnt数值==0,相应的就删除
当一个对象有新的引用时,它的ob_refcnt就会增加,当引用他的对象被删除时,他的ob_refcnt就会减小
引用计数的优点:

  • 简单
  • 实时性:一旦没有引用,内存就释放了。不用像其他机制等到特定时间,实时性还有一个好处:内存分配相应的分摊到了平时

引用计数的缺点:

  • 维护引用计数相对耗费资源
  • 循环引用
a = []
b = []
a.append(b)
b.append(a)

a和b的相互应用,如果不存在其他对象对它的引用,相应的引用计数就会一直为1,内存永远得不到释放

4. 在Python中的零代
因为存在循环应用的问题,相应的Python引入了Generational Zero,Python中使用一种不同的链表来追踪活跃的对象,也就是“活跃列表”,Python内部的C代码将其称为零代(Generational Zero),每当创建一个对象或者其他值的时候,相应的就将其添加在这个链表中
在这里插入图片描述
随后,Python会循环遍历零代列表上的每个对象,检查列表中每个互相引用的对象,根据规则减掉其引用计数。在这个过程中,Python会一个接一个的统计内部引用的数量以防过早地释放对象。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值