梦想家博客

程序员知识

python 垃圾回收机制
  • 1.python垃圾回收策咯
    • python采用的是引用计数机制为主,标记-清除和分代收集(隔代回收、分代回收)两种机制为辅的策略
  • 2.引用计数
    • 1.引用计数+1
      • 1.对象被创建 a="hello"
      • 2.对象被引用 b=a
      • 3.对象作为参数带入函数 func(a)
      • 4.对象作为元素,存储在容器中 list1=[a,1]
    • 2.引用技术-1
      • 1.对象别名显示销毁  del a
      • 2.对象别名赋予新对象 a=12
      • 3.一个对象离开作用域,在函数中作为参数,函数执行完毕,局部变量回收
      • 4.对象所在容器被销毁,或容器删除该对象
    • 3.sys.getrefcount()查看引用计数
      • import sys
      • sys.getrefcount(a) 在ipython中比实际多一个,a被传入函数getrefcount中,多了一个
      • 在pycharm比实际多三个
    • 4.小整数大整数,单个字符,intern 字符串驻留机制
      • 1.小整数 [-5,256] 共用对象,常驻内存,引用计数为0,不会被释放。
      • 2.单个字符  共用对象,常驻内存,引用计数为0,不会被释放。
      • 3.大整数 共用内存,引用计数为0,销毁 .
      • 4.单个单词(没有空格和特殊符号)intern机制,共用对象,引用计数为0,则销毁 。
    • 5.引用机制优缺点
      • 1.简单,实时性:一旦没有引用,内存就直接释放了。不用像其他机制等到特定时机。实时性还带来一个好处:处理回收内存的时间分摊到了平时。
      • 2.维护引用计数消耗资源,解决不了循环引用,因为对象之间相互引用,每个对象的引用都不会为0,所以这些对象所占用的内存始终都不会被释放掉
  • 3.标记清除优缺点
    • 1.标记-清除的出现打破了循环引用,原理:
      • 首先将现在的内存链表一分为二,一条链表中维护root object集合,成为root链表,而另外一条链表中维护剩下的对象,成为unreachable链表。
      • 一旦在标记的过程中,发现现在的unreachable可能存在被root链表中直接或间接引用的对象,就将其从unreachable链表中移到root链表中;
      • 当完成标记后,unreachable链表中剩下的所有对象就是名副其实的垃圾对象了,接下来的垃圾回收只需限制在unreachable链表中即可。
    • 2.该机制所带来的额外操作和需要回收的内存块成正比。
  • 4.隔代回收
    • 1.原理
      • 将系统中的所有内存块根据其存活时间划分为不同的集合,每一个集合就成为一个“代”,垃圾收集的频率随着“代”的存活时间的增大而减小。
      • 也就是说,活得越长的对象,就越不可能是垃圾,就应该减少对它的垃圾收集频率
    • 2.每次当你创建一个对象或其他什么值的时候,Python会将其加入零代链表,Python会循环遍历零代列表上的每个对象,
      • 检查列表中每个互相引用的对象,根据规则减掉其引用计数。在这个过程中,Python会一个接一个的统计内部引用的数量以防过早地释放对象。
    • 3.gc模块  import gc
      • 1.垃圾回收后的对象会放在gc.garbage列表里面
      • 2.gc.collect()会返回不可达的对象数目(回收对象) 可以输入参数,0代表只检查零代的对象,1代表检查零,一代的对象,2代表检查零,一,二代的对象,默认为2
      • 3.gc.set_debug(flags) 设置gc的debug日志,一般设置为gc.DEBUG_LEAK,不设置将无法回收数据,gc.garbage列表里面为空
      • 4.gc.get_threshold() 获取的gc模块中自动执行垃圾回收的频率(阈值) 元组形式,一般为(700,10,10)
      • 5.gc.get_count() 获取当前自动执行垃圾回收的计数器,返回一个长度为3的元组,(当前零代,一代,二代的对象数目)
      • 6.gc.set_threshold(threshold0[, threshold1[, threshold2]) 设置自动执行垃圾回收的频率。(阈值)
      • 7.gc.disable() 关闭python的垃圾回收机制
      • 8.有三种情况会触发垃圾回收
        • 1.调用gc.collect()
        • 2.当gc模块的计数器达到阀值的时候。
        • 3.程序退出的时候
阅读更多
个人分类: python
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

python 垃圾回收机制

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭