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)  这个引用计数的个数会比实际的个数多一个