理解Python垃圾回收机制
一.垃圾回收机制 #encoding=utf-8 __author__ = 'kevinlu1010@qq.com' class ClassA(): def __init__(self): print 'object born,id:%s'%str(hex(id(self))) def __del__(self): print 'object del,id:%s'%str(hex(id(self))) def f1(): while True: c1=ClassA() del c1 执行f1()会循环输出这样的结果,而且进程占用的内存基本不会变动 object born,id:0x237cf58 object del,id:0x237cf58 c1=ClassA()会创建一个对象,放在0x237cf58内存中,c1变量指向这个内存,这时候这个内存的引用计数是1 1、导致引用计数+1的情况
2、导致引用计数-1的情况
demo def func(c,d): print 'in func function',sys.getrefcount(c) - 1 print 'init',sys.getrefcount(11) - 1 a = 11 print 'after a=11',sys.getrefcount(11) - 1 b = a print 'after b=1',sys.getrefcount(11) - 1 func(11) print 'after func(a)',sys.getrefcount(11) - 1 list1 = [a,12,14] print 'after list1=[a,14]',sys.getrefcount(11) - 1 a=12 print 'after a=12',sys.getrefcount(11) - 1 del a print 'after del a',sys.getrefcount(11) - 1 del b print 'after del b',sys.getrefcount(11) - 1 # list1.pop(0) # print 'after pop list1',sys.getrefcount(11)-1 del list1 print 'after del list1',sys.getrefcount(11) - 1 输出 init 24 after a=11 25 after b=1 26 in func function 28 after func(a) 26 after list1=[a,14] 27 after a=12 26 after del a 26 after del b 25 after del list1 24 问题:为什么调用函数会令引用计数+2 3、查看一个对象的引用计数 sys.getrefcount(a)可以查看a对象的引用计数,但是比正常计数大1,因为调用函数的时候传入a,这会让a的引用计数+1 二.循环引用导致内存泄露 def f2(): while True: c1=ClassA() c2=ClassA() c1.t=c2 c2.t=c1 del c1 del c2 执行f2(),进程占用的内存会不断增大。 object born,id:0x237cf30 object born,id:0x237cf58 创建了c1,c2后,0x237cf30(c1对应的内存,记为内存1),0x237cf58(c2对应的内存,记为内存2)这两块内存的引用计数都是1,执行c1.t=c2和c2.t=c1后,这两块内存的引用计数变成2. 三.垃圾回收 deff3(): # print gc.collect() c1=ClassA() c2=ClassA() c1.t=c2 c2.t=c1 del c1 del c2 print gc.garbage print gc.collect() #显式执行垃圾回收 print gc.garbage time.sleep(10) if __name__ == '__main__': gc.set_debug(gc.DEBUG_LEAK) #设置gc模块的日志 f3() 输出: gc: uncollectable <ClassA instance at 0230E918> gc: uncollectable <ClassA instance at 0230E940> gc: uncollectable <dict 0230B810> gc: uncollectable <dict 02301ED0> object born,id:0x230e918 object born,id:0x230e940 4
1.调用gc.collect(), 常用函数: 5、gc模块的自动垃圾回收机制 gc模块里面会有一个长度为3的列表的计数器,可以通过gc.get_count()获取。 print gc.get_count() # (590,8,0) a = ClassA() print gc.get_count() # (591,0) del a print gc.get_count() # (590,0) 3是指距离上一次二代垃圾检查,一代垃圾检查的次数,同理,0是指距离上一次三代垃圾检查,二代垃圾检查的次数。 gc模快有一个自动垃圾回收的阀值,即通过gc.get_threshold函数获取到的长度为3的元组,例如(700,10,10)
其他
以上就是本文的全部内容。希望对大家的学习有所帮助。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |