1 介绍
python采用引用计数为主,分代回收为辅的策略
引用计数的优点
* 简单 实时性,一旦没有引用,内存直接释放,不用像其他机制等到特定时机。并且处理垃圾回收的时间分摊到了平时。
引用计数的缺点
* 维护引用计数消耗资源
* 会导致循环引用,泄露内存
****了解
ruby早在代码开始运行前,早已创建安好成千上百的预创建对象,并且把他们链接在链上,名曰可用列表 见下图
举一个相互引用的例子
举一个相互引用的例子
import gc
class ClassA():
def __init__(self):
print("nihao")
def f2():
while True:
c1 = ClassA()
c2 = ClassA()
C1.t = c2
c2.t = c1
del c1
del c2 #删除索引
#gc.collect() #如果disable的话,就用collect手动回收
gc.disable()
f2()
2 gc 模块
gc模块提供一个垃圾回收的选项,采用引用计数的方法管理内存,缺陷是循环引用,而gc模块主要功能,解决循环引用问题。
gc模块的自动垃圾回收机制,必须要import gc并且is_eable= True,才会启动自动垃圾回收机制,主要作用是发现并清理不可达对象
垃圾回收 = 垃圾检查+垃圾回收
在python中,采用分代回收的方法。把对象分为三代,一开始,对象在创建的时候,放在一代中,如果在一次次的的垃圾检查中存活下来,该对象会被存放在二代中,同理在二代一次次的检查中存活下来的会放在三代中
¥¥¥¥导致引用计数 +1 的情况
对象被创建 对象被引用 对象被作为参数,被传入到函数中
对象被引用 对象作为一个元素,放在容器中
¥¥¥¥导致引用 -1 的情况
对象的别名,被现行的消除 del a
对象的别名被赋予新的对象
一个对象离开他的作用域,一个函数执行完毕
对象所在的容器被销毁
常用函数
gc.set_debug(flags) 设置gc的debug的日志,一般设置为gc.DEBUG_LEAK
gc.collect(gernation) 显示进行垃圾回收,可以回收参数,
gc.get_threshold() 获取gc模块中自动执行垃圾回收的频率(700,10,10)
gc.set_threshold(threshold0,[,threshold1[,threshold2])
gc.get_count() 获取当前自动执行垃圾回收的计数器
demo (300,4,4),(600,4,4) (190,5,4)