Garbage Collection
-
小整数对象池
Python中为了避免为整数频繁申请和销毁内存空间,Python对小整数[-5,257)这些整数对象是提前创建好的,不会被垃圾回收。在一个Python程序中,所有位于这个返回内的整数使用的都是同一个对象。
同理,单个字母也是如此。对于超过这个数值大小的数字就单独创建一个地址。
-
intern机制
如果多个变量同时指向同一个str对象,相应的str类型的内存会常驻
-
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会一个接一个的统计内部引用的数量以防过早地释放对象。