设为首页 加入收藏

TOP

关于 Python 垃圾回收机制的初步认识
2018-03-02 06:57:02 】 浏览:147
Tags:关于 Python 垃圾 回收 机制 初步 认识

一、前言


  Python 是一门高级语言,使用起来类似于自然语言,开发的时候自然十分方便快捷,原因是Python在背后为我们默默做了很多事情,其中一件就是垃圾回收,来解决内存管理,内存泄漏的问题。


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


二、引用计数


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


    1. 创建时


    2. 被引用时


    3. 作为参数传入函数时


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


    1. 被del


    2. 被重引用


    3. 函数执行完毕


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


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


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


三、 循环引用


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


a = []
b = []


a.append(b)
b.append(a)
print(a,b)


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


四、解决方案


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


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


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


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


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


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


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


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


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


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


备注:


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


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


  gc 模块 留待以后研究。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇JQuery EasyUI 结合ztrIee的后台.. 下一篇使用Prettier格式化JavaScript代码

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目