1.垃圾回收概述
python的垃圾回收机制有引用计数,标记清除和分代回收三种.
python采用的是引用计数机制为主,标记-清除和分代收集两种机制为辅的策略
2.引用计数器
导致引用计数器+1的情况
1.对象被创建,例如p=Person()
2.对象被引用,例如p2 = p
3.对象被作为参数,传入到一个函数中,例如func§
4.对象作为一个元素,存储在容器中,例如list1=[p1,p2]
导致引用计数-1的情况
1.对象的别名被显示撤销,例如del p
2.对象的别名被赋予新的对象,例如p=Person()
3.一个对象离开它的作用域,例如f函数执行完毕时,func函数中的局部变量
4.对象所在的容器被销毁,或从容器中删除对象
3.循环引用问题
import gc
import time
gc.disable()
class Person():
pass
while True:
p1 = Person()
p2 = Person()
p1.friend = p2
p2.friend = p1
del p1
del p2
4.标记清除
设置 p1.friend = None 或者设置 p2.friend= None,取消循环引用
5.分代回收
遍历每个容器对象,找到其引用的对象,将被引用的对象计数器-1.
如果该对象的引用次数为1,则将被引用的对象计数器-1,会将该对象回收,这是第0代;
否则就把该对象放在第一代,然后定时再进行一次对象计数器-1,如果该对象还没有被回收就把该对象放在第二代,以此类推.
6.GC模块
#gc模块
import gc
import sys
class Person():
pass
#禁用GC
gc.disable()
#手动执行GC
gc.collect()
p = Person()
#获得对象的引用计数
print(sys.getrefcount§)
#得到GC阈值
print(gc.get_threshold())
#距离上一次一代垃圾检查,Python分配内存的数目减去释放内存的数目
print(gc.get_count())
#设置GC阈值
#gc.set_threshold()