GC垃圾回收机制
-
GC的引用计数的缺点-循环引用
import gc class Test(object): def __init__(self): print("object born,id:%s"%str(hex(id(self)))) def f2(): while True: c1 = Test() c2 = Test() c1.t = c2 c2.t = c1 del c1 del c2 # gc.collect() # 开启一次垃圾回收 gc.disable() # 关闭python后台垃圾回收功能 f2() # 运行结果 object born,id:0x101f24208 object born,id:0x101f24240 object born,id:0x101f24278 object born,id:0x101f242b0 object born,id:0x101f242e8 object born,id:0x101f24320 object born,id:0x101f24358 object born,id:0x101f24390 object born,id:0x101f243c8 object born,id:0x101f24400 object born,id:0x101f24438 object born,id:0x101f24470 object born,id:0x101f244a8 object born,id:0x101f244e0 object born,id:0x101f24518 object born,id:0x101f24550 object born,id:0x101f24588 死循环
-
整数,字符串不可变的范围
小整数对象池 Python 对小整数的定义是[-5,257)这些整数对象是提前建立好的,不会被垃圾回收.在一个Python的程序中 所有位于这个范围内的整数使用都是同一个对象 大整数对象池 就是不在上面那个范围的 每个大整数,均创建一个新的对象 intern机制 第一的字符串使用26个字母组成的 不管定义多少个都是指向的同一个引用 用了特殊符号的 那就是均创建一个新对象 总结 小整数[-5,257)共用对象,常驻内存 但个字符共用对象,常驻内存 单个单词,不可修改,默认开启intern机制,共用对象,引用计数为0,侧销毁
-
GC的垃圾回收机制
GC以引用计数为主 隔代回收为辅 gc模块里 常用的函数 常用函数: 1.gc.set_debug(flags) 设置gc的debug日志,一般设置为gc.DEBUG_LEAK 2.gc.collect(参数) 显示垃圾回收,可以输入参数,0代表只检查第一代的对象,1代表检查一,二带对象,2代表检查一,二,三代的对象,如果不传参数,执行一个full collection,也就是等于传2.反回不可达(unreachable objects)对象的数目 3.gc.get_threshold()获取的gc模块中自动执行垃圾回收的频率 4.gc.set_threshold(参数,参数,参数)设置自动执行垃圾回收的频率 5.gc.get_count()获取当前自动执行垃圾回收的计数器,反回一个长度为3的列表 6.gc.garbage 显示被清理的垃圾对象的信息 导致引用计数+1的情况 1.对象被创建,列如a=23 2.对象被引用,列如b=a 3.对象被作为参数,传入到一个函数中,列如func(a) 4.对象作为一个元素,存储在容器中,列如list1=[a,a] 导致引用计数-1的情况 1.对象的别名被显示销毁,列如del a 2.对象的别名被赋予新的对象,列如a=24 3.一个对象离开它的作用域,列如f函数执行完毕时,func函数中的局部变量(全局变量不会) 4.对象所在的容器被销毁,或从容器中删除对象 查看一个对象的引用计数 import sys a = "hello world" sys.getrefcount(a) 这个引用计数的个数会比实际的个数多一个