python GC垃圾回收机制

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)

 

posted @ 2019-01-06 18:36  团子emma  阅读(264)  评论(0)    收藏  举报