pythonGC垃圾回收机制

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)  这个引用计数的个数会比实际的个数多一个
    
上一篇:Ubuntu -- 添加Pycharm图标到桌面


下一篇:Cannot resolve com.born:xxx_dao:unknown