欢迎加入QQ讨论群258996829
麦子学院 头像
苹果6袋
6
麦子学院

Python垃圾回收机制

发布时间:2018-04-19 17:41  回复:0  查看:3255   最后回复:2018-04-19 17:41  

本文和大家分享的主要是python垃圾回收机制相关内容,垃圾回收机制是python中非常重要的知识点,下面一起来看看吧,希望对大家学习python有所帮助。

  不同于C/C++,像Python这样的语言是不需要程序员写代码来管理内存的,它的GC(Garbage Collection)机制 实现了自动内存管理。GC做的事情就是解放程序员的双手,找出内存中不用的资源并释放这块内存。下面我们来看看PythonGC是怎么做的:

  Python自带的解释器CPython主要使用了三种垃圾回收机制(引用计数为主,标记-清除和分代回收为辅)

  . 引用计数

  . 标记清除

  . 分代回收

  下面让我们分别了解下这几种机制:

  引用计数

  引用计数法 Reference Counting 的原理是,每个对象都维护一个 引用计数 字段,记录这个对象被引用的次数如果有新的引用指向对象,对象引用计数就加一,引用被销毁时,对象引用计数减一,当用户的引用计数为0时,该内存被释放。可以通过 sys.getrefcount() 函数查看对象被引用的个数。

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

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

  . 无法解决循环引用问题

  所谓循环引用就是:有一组对象的引用计数不为0,但是这组对象实际上并没有被变量引用,它们之间是相互引用,而且也不会有其他的变量再去引用这组对象,最终导致如果使用 引用计数法 这些对象占用的内存永远不会被释放。

  写一段代码举个例子:

  In [23]: a = []

  In [24]: b = []

  In [25]: a.append(b)

  In [26]: b.append(a)

  In [27]: a

  Out[27]: [[[...]]]

  In [28]: b

  Out[28]: [[[...]]]

  可以看到,现在 a b 都出现了循环引用,此时就算使用 del 语句删除变量,被使用的内存也不会被回收,所以就需要第二种GC机制:

  标记清除

  标记清除 Mark-Sweep 是针对 循环引用问题 的回收机制,作用的对象是 容器类型 的对象(比如:listsetdict)

  原理是:通过根节点对象(不会被删除的对象)对有向图把所有 活动对象 打上标记,然后回收没有被标记的 非活动对象 

  分代回收

  分代回收是建立在标记清除基础上的一种辅助回收容器对象的GC机制。 无论开发的程序类型如何,规模如何,都有这样的相同之处:一些比例的内存生存周期都很短,而另一些内存的生存周期比较长,可能会伴随着整个程序的开始和结束。 所以分代回收就根据系统中内存存活时间把它们划分成不同的集合:一共分成三个集合,每个集合称为一个   它们的垃圾收集频率  对象 存活存活时间的增大  减小。也就是说:对于存活时间越长的对象,就越不可能是垃圾,减少对其的收集频率。而新创建的对象都在第一代,第一代集合总数达到上限后,会触发GC机制:可以回收的对象所占的内存被释放,不能被回收的移到中年代。

 

来源:网络

您还未登录,请先登录

热门帖子

最新帖子