zoukankan      html  css  js  c++  java
  • python垃圾回收机制

    • 垃圾回收机制

      Python中,主要依靠gc(garbage collector)模块的引用计数技术来进行垃圾回收,在引用
      计数的基础上,通过“标记 -清除”( mark and sweep )解决容器对象可能产生的
      循环引用问题,通过“分代回收”( generation collection )以空间换时间的方法
      提高垃圾回收效率。

      • 1 引用计数

        Pyobject 是每个对象必有的内容,其中ob_refcnt 就是引用计数。当一个对象有新的引用时,它的ob_refcnt 就会增加,当引用它的对象删除,它的ob_refcnt就会减少,引用技术为0,该对象生命就结束了。

        优点:简单,时效性

        缺点: 维护引用计数消耗资源, 容器对象的循环引用

      • 2 标记-清除机制

        基本思路是先按需分配,等到没有空闲内存的时候从寄存器和程序栈上的引用出发,遍历以对象为节点、以引用为边构成的图,把所有可以访问到的对象打上标记,然后清扫一遍内存空间,把没有被标记的对象释放

      • 3 分代技术

        分代回收:将系统中的所有内存块根据其存活时间划分为不同的集合,每个集合就是一个"代",垃圾收集频率随着“代”的存活时间的增大而减少。存活时间通常利用几次垃圾回收来度量。

        python默认定义三代对象集合,索引数越大,对象存活时间越长。

        当某些内存块 M 经过了 几次垃圾收集的清洗之后还存活时,我们就将内存块 M 划
        到一个集合 A 中去,而新分配的内存都划分到集合 B 中去。当垃圾收集开始工作时,
        大多数情况都只对集合 B 进行垃圾回收,而对集合 A 进行垃圾回收要隔相当长一段
        时间后才进行,这就使得垃圾收集机制需要处理的内存少了,效率自然就提高了。
        在这个过程中,集合 B 中的某些内存块由于存活时间长而会被转移到集合 A 中,当
        然,集合 A 中实际上也存在一些垃圾,这些垃圾的回收会因为这种分代的机制而被
        延迟。

    • python的内存管理

      ​ 引用计数、垃圾回收和内存池

      ​ 大内存使用malloc进行分配 (256K为界限分大小内存 ),free函数释放

      ​ 小内存使用内存池进行分配,

  • 相关阅读:
    使用git pull文件时和本地文件冲突怎么办?
    Git回滚代码到某个commit
    PHP如何在页面中原样输出HTML代码
    git 创建本地分支、提交到远程分支
    php mysqli扩展之预处理
    htmlspecialchars() 函数过滤XSS的问题
    PHP json_encode里面经常用到的 JSON_UNESCAPED_UNICODE和JSON_UNESCAPED_SLASHES
    javascript学习笔记——Array
    javascript学习笔记——Object
    javascript的底层实现学习总结
  • 原文地址:https://www.cnblogs.com/-min/p/12833242.html
Copyright © 2011-2022 走看看