• Python GC


    Python垃圾回收机制

      Python这样的语言是不需要程序员写代码来管理内存的,它的GC(Garbage Collection)机制实现了自动内存管理。下面我们来看看Python的GC是怎么做的。

      Python自带的解释器CPython主要使用了三种垃圾回收机制

      1.引用计数

      2.标记清除

      3.分代回收

    引用计数

      对于浅拷贝和深拷贝

      浅拷贝 拷贝出来的a对象是引用x和y,当修改x或y的值时,a也会改变;
      深拷贝 会把里面的元素也重新拷贝一份,拷贝了一份x和y的值相等的两个元素,修改x和y的值,不会对b产生影响。

      每个对象都维护一个引用计数字段,记录这个对象被引用的次数。如果有新的引用指向该对象,对象引用计数就加一。引用被销毁时,对象引用计数减一,当用户的引用计数为0时,该内存被释放。

      这种方法主要存在两种问题

      1.需要去维护引用计数,存在执行效率问题

      2.无法解决循环引用问题

        循环引用时,就算使用del语句删除变量,被使用的内存也不会被回收,所以就需要第二种GC机制。

    标记清除

      标记清除Mark-Sweep是针对循环引用问题的回收机制,作用的对象是容器类型的对象(list、set、dict等)。
      原理是:通过根节点对象(不会被删除的对象),对有向图把所有活动对象打上标记,然后回收没有被标记非活动对象

    分代回收

      分代回收是建立在标记清除基础上的一种辅助回收容器对象的GC机制。

      分代回收就根据系统中内存存活时间把它们划分成不同的集合:一共分成三个集合,每个集合称为一个。它们的垃圾收集频率对象存活时间增大减小

      也就是说对于存活时间越长的对象,就越不可能是垃圾,减少对其的收集频率。

      新创建的对象都在第一代,第一代集合总数达到上限后,会触发GC机制。

      可以回收的对象所占的内存被释放,不能被回收的移到中年代。

    转载自https://www.jianshu.com/p/9d10a1daaac3

  • 相关阅读:
    web设计师和前端设计师的互动—前端工程师应该具备的三种思维
    PyQt入门系列(一):Hello World
    PIL在windwos系统下Image.show无法显示图片问题的解决方法
    大赛学习笔记
    ArcGIS Add-in开发(一)--获取选定要素的属性值
    【转】WPF颜色相关操作
    斗地主小代码
    MAVEN配置私服仓库
    Error creating bean with name 'transactionManager' defined in ServletContext resource XXX
    org.hibernate.HibernateException: getFlushMode is not valid without active transaction
  • 原文地址:https://www.cnblogs.com/liubosong/p/10747340.html
Copyright © 2020-2023  润新知