python 垃圾回收机制的思考

1、前言服务器

  Python 是一门高级语言,使用起来相似于天然语言,开发的时候天然十分方便快捷,缘由是Python在背后为咱们默默作了不少事情,其中一件就是垃圾回收,来解决内存管理,内存泄漏的问题。数据结构

  内存泄漏:当程序不停运行,有一部分对象没有做用,但所占内存没有被释放,服务器内存随时间愈来愈少,最终致使系统的崩溃,因此内存泄漏是一个须要重点关注的问题。app

2、引用计数函数

  Python 标记一个对象是否还有用的方法就是用引用计数,如下情形会为该对象的计数+1:性能

    1. 建立时  spa

    2. 被引用时code

    3. 做为参数传入函数时对象

  相反,如下情形会为该对象的计数-1:blog

    1. 被del接口

    2. 被重引用

    3. 函数执行完毕

  查看某一元素的计数能够经过 sys.getrefcount(),当引用计数为0 的时候,内存就会被释放。

  能够想到和其余垃圾回收相比,Python的机制优势很明显,就是实时性,Python的gc 模块就是开放的接口用以管理。

  也能够很容易猜到这样的缺点就是性能相对较低,看过这样的报道,instagram 经过禁用 gc 模块,性能提高10%!

3、 循环引用

  有一种特殊状况,当两个或多个变量互相循环引用的时候,按照计数引用的机制就没法处理了

  

a = [] b = [] a.append(b) b.append(a) print(a,b)

a,b 的引用计数均为2,没法回收二者内存

 

4、解决方案

  1. 经过 ”标记-清除“ 来解决循环调用问题:

    垃圾回收器定时去寻找这类循环调用,并清除

    具体是 先从 根对象集合副本中 开始寻找,这些对象计数不为0,没有被清除

    而后一个个检测,将其分为可达对象和不可达对象,底层经过链表的数据结构实现,经过操做副本清除标记,来在不影响原数据的状况下,判断是否为循环调用

    最后将不可达对象清除,释放内存,效率较低。    

    有三种状况会触发垃圾回收:
      1.调用gc.collect(),
      2.当gc模块的计数器达到阀值的时候。
      3.程序退出的时候

  2.分代回收,利用 “空间换时间”策略提升效率:

    有些内存块生存时间从开始到结束,有些则很短,因此一样对他们进行垃圾回收是很浪费的一件事情,

    全部对象开始被划分到零代中,Python 默认 有三代,一个代就是一个链表

    年轻代中的对象优先处理,经历垃圾处理次数愈多的,越“老资格” ,就会上升,最终放在第二代中。

    

备注:

  Python的垃圾回收机制是经过检测数量是否到达阈值来决定是否进行。

  Python 这方面源码是c写的,暂时看不懂,留待之后搞懂链表结构再来研究,

  gc 模块 留待之后研究。

相关文章
相关标签/搜索