• python垃圾回收三之标记清除


    #第一组循环引用#
    a = [1,2]
    b = [3,4]
    a.append(b)
    b.append(a)
    del a
    
    ##
    
    #第二组循环引用#
    
    c = [4,5]
    d = [5,6]
    c.append(d)
    d.append(c)
    del c
    del d
    #至此,原a和原c和原d所引用的对象的引用计数都为1,b所引用的对象的引用计数为2,
    e [7,8]
    del e

    现在说明一下标记清除:代码运行到上面这块了,此时,我们的本意是想清除掉c和d和e所引用的对象,而保留a和b所引用的对象。但是c和d所引用对象的引用计数都是非零,原来的简单的方法只能清除掉e,c和d所引用对象目前还在内存中。

    假设,此时我们预先设定的周期时间到了,此时该标记清除大显身手了。他的任务就是,在a,b,c,d四个可变对象中,找出真正需要清理的c和d,而保留a和b。

    首先,他先划分出两拨,一拨叫root object(存活组),一拨叫unreachable(死亡组)。然后,他把各个对象的引用计数复制出来,对这个副本进行引用环的摘除。摘除完毕,此时a的引用计数的副本是0,b的引用计数的副本是1,c和d的引用计数的副本都是0。那么先把副本为非0的放到存活组,副本为0的打入死亡组。如果就这样结束的话,就错杀了a了,因为b还要用,我们把a所引用的对象在内存中清除了b还能用吗?显然还得在审一遍,别把无辜的人也给杀了,于是他就在存活组里,对每个对象都分析一遍,由于目前存活组只有b,那么他只对b分析,因为b要存活,所以b里的元素也要存活,于是在b中就发现了原a所指向的对象,于是就把他从死亡组中解救出来。至此,进过了一审和二审,最终把所有的任然在死亡组中的对象通通杀掉,而root object继续存活。b所指向的对象引用计数任然是2,原a所指向的对象的引用计数仍然是1

  • 相关阅读:
    Python中的多线程编程
    Python中的变量以及变量的命名
    Python中的列表、元组、字典、字符串及切片操作
    Python中的socket编程
    Nginx对代理HTTP资源的限制访问
    【笨嘴拙舌WINDOWS】GDI映射方式
    【笨嘴拙舌WINDOWS】GDI(2)
    【笨嘴拙舌WINDOWS】GDI(1)
    【笨嘴拙舌WINDOWS】Dj,oh!nonono,It is about DC
    【笨嘴拙舌WINDOWS】消息机制
  • 原文地址:https://www.cnblogs.com/saolv/p/8411993.html
Copyright © 2020-2023  润新知