小猿圈python之垃圾回收机制

栏目: Python · 发布时间: 5年前

内容简介:一、前言Python 是一门高级语言,使用起来类似于自然语言,开发的时候自然十分方便快捷,原因是Python在背后为我们默默做了很多事情,其中一件就是垃圾回收,来解决内存管理,内存泄漏的问题。内存泄漏:当程序不停运行,有一部分对象没有作用,但所占内存没有被释放,服务器内存随时间越来越少,最终导致系统的崩溃,所以内存泄漏是一个需要重点关注的问题。

一、前言

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

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

二、python的垃圾回收机制包括引用计数、循环引用,那么我们通过什么来解决呢,下面讲一下。

2.1 引用计数

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

  1. 创建时
  2. 被引用时
  3. 作为参数传入函数时

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

  1. 被del
  2. 被重引用
  3. 函数执行完毕

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

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

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

2.2 循环引用

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

Python

a = []

b = []

a.append(b)

b.append(a)

print(a,b)

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

2.3 解决方案

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

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

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

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

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

有三种情况会触发垃圾回收:

1.调用gc.collect(),

2.当gc模块的计数器达到阀值的时候。

3.程序退出的时候

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

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

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

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

需要研究:

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

gc模块


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

雷军

雷军

蔡艳鹏 / 2012-12 / 29.80元

《雷军:人因梦想而伟大》内容简介:人生充满着期待,梦想连接着未来。雷军一直有个梦,就是建一个受世人尊敬的企业。他不仅建立了属于自己的受人尊敬的企业,也在帮助别人实现心中的梦想。雷军可以说是创业者、职场人奋斗的榜样,从他在金山的不折不挠,在投资界的百投百中,到小米的成功……无不充满传奇,让无数人争相效仿。一起来看看 《雷军》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

MD5 加密
MD5 加密

MD5 加密工具