# python 中垃圾回收机制:
# 引用计数为主,分代回收为辅的机制
# 引用计数:将程序运行中创建的对象都分配一个计数器,统计该对象被引用的次数
# 不同类型的对象,在内存中存储的方式不一样:小整数(-5, 256),和单个字母是能被不同变量公用的对象,在内存中常驻;
# 单词或者说是没有空格的字符串,是共用对象,计数为0,便被销毁;带空格的字符串和长整数是不共用对象,计数为0时,
# 便被销毁;
# 当指向大整数或字符串的变量被修改时,实际上是重新生成了一个对象,原对象若计数为0时,便被销毁。
# 分代回收:python在内存中有三条链表存储对象,分别称之为0代、1代和2代。每一次生成的对象先挂到0代上,当距离上次检查回收,python分
# 配内存的数目和回收内存的数目之差达到上限值(一般为700)时,会对0代进行一次遍历检查,即对0代上每一个对象进行循环引用检
# 发现存在互相引用关系的双方,就对它们的计数-1, 剩下的计数仍不为0的对象将其挂在1代链表上; 当对0代的检查次数到达一个上
# 限(一般为10)时, 便会对1代链表上的所有对象进行一次遍历检查, 将剩下的计数不为0的变量挂到2代链表上。
import gc
print(gc.get_count()) # 返回包含三个数的元组, 三个数分别代表python分配内存的数目和回收内存的数目之差, 处理0代对象
# 链表的次数,处理1代链表的次数
print(gc.get_threshold()) # 同样返回包含三个数的元组,分别代表get_count()得到的三个变量的上限。
运行结果:
(338, 2, 1)
(700, 10, 10)
def f():
while True:
a = A()
b = A()
a.t = b
b.t = a
del a
del b
# gc.collect() # 开启一次垃圾回收
gc.disable() # 关闭python后台垃圾回收功能
f()
有三种情况会触发垃圾回收:
1. 当gc模块中的计数器达到阀值的时候,自动回收垃圾
2. 当手动调用 gc.collect()的时候
3. 当程序退出时,python解释器来回收垃圾。