Python垃圾回收机制三种实现方法


Posted in Python onApril 27, 2020

引用计数

Python语言默认采用的垃圾收集机制是『引用计数法 Reference Counting』,该算法最早George E. Collins在1960的时候首次提出,50年后的今天,该算法依然被很多编程语言使用。

『引用计数法』的原理是:每个对象维护一个ob_ref字段,用来记录该对象当前被引用的次数,每当新的引用指向该对象时,它的引用计数ob_ref加1,每当该对象的引用失效时计数ob_ref减1,一旦对象的引用计数为0,该对象立即被回收,对象占用的内存空间将被释放

缺点:它的缺点是需要额外的空间维护引用计数,这个问题是其次的,不过最主要的问题是它不能解决对象的“循环引用”,因此,也有很多语言比如Java并没有采用该算法做来垃圾的收集机制。

import sys
class A():
  def __init__(self):
    '''初始化对象'''
    print('object born id:%s' %str(hex(id(self))))
  def f1():
  '''循环引用'''
  while True:
    c1=A()
    c2=A()
    c1.t=c2
    c2.t=c1
    del c1
    del c2

实例化c1,c2后,这两个对象的引用计数都是1,执行c1.t=c2和c2.t=c1后,引用计数变成2.
在del c1后,内存c1的对象的引用计数变为1,由于不是为0,所以c1的对象不会被销毁,同理,在del c2后也是一样的。
虽然它们两个的对象都是可以被销毁的,但是由于循环引用,导致垃圾回收器都不会回收它们,所以就会导致内存泄露。

标记清楚

标记清除(Mark—Sweep)』算法是一种基于追踪回收(tracing GC)技术实现的垃圾回收算法。它分为两个阶段:第一阶段是标记阶段,GC会把所有的『活动对象』打上标记,第二阶段是把那些没有标记的对象『非活动对象』进行回收。那么GC又是如何判断哪些是活动对象哪些是非活动对象的呢?

Python垃圾回收机制三种实现方法

对象之间通过引用(指针)连在一起,构成一个有向图,对象构成这个有向图的节点,而引用关系构成这个有向图的边。从根对象(root object)出发,沿着有向边遍历对象,可达的(reachable)对象标记为活动对象,不可达的对象就是要被清除的非活动对象。根对象就是全局变量、调用栈、寄存器。 mark-sweepg 在上图中,我们把小黑圈视为全局变量,也就是把它作为root object,从小黑圈出发,对象1可直达,那么它将被标记,对象2、3可间接到达也会被标记,而4和5不可达,那么1、2、3就是活动对象,4和5是非活动对象会被GC回收。

标记清除算法作为 Python 的辅助垃圾收集技术主要处理的是一些容器对象,比如 list、dict、tuple,instance 等,因为对于字符串、数值对象是不可能造成循环引用问题。Python使用一个双向链表将这些容器对象组织起来。不过,这种简单粗暴的标记清除算法也有明显的缺点

缺点:清除非活动的对象前它必须顺序扫描整个堆内存,哪怕只剩下小部分活动对象也要扫描所有对象

分代回收

分代回收是一种以空间换时间的操作方式,Python 将内存根据对象的存活时间划分为不同的集合,每个集合称为一个代,Python将内存分为了3“代”,分别为年轻代(第0代)、中年代(第1代)、老年代(第2代),他们对应的是3个链表,它们的垃圾收集频率与对象的存活时间的增大而减小。

新创建的对象都会分配在年轻代,年轻代链表的总数达到上限时,Python垃圾收集机制就会被触发,把那些可以被回收的对象回收掉,而那些不会回收的对象就会被移到中年代去,依此类推,老年代中的对象是存活时间最久的对象,甚至是存活于整个系统的生命周期内。

同时,分代回收是建立在标记清除技术基础之上。分代回收同样作为Python的辅助垃圾收集技术处理那些容器对象

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
pyv8学习python和javascript变量进行交互
Dec 04 Python
python实现自动登录人人网并访问最近来访者实例
Sep 26 Python
Python实现基于权重的随机数2种方法
Apr 28 Python
解决tensorflow测试模型时NotFoundError错误的问题
Jul 27 Python
Python3.5 处理文本txt,删除不需要的行方法
Dec 10 Python
Python利用神经网络解决非线性回归问题实例详解
Jul 19 Python
python requests指定出口ip的例子
Jul 25 Python
python+openCV调用摄像头拍摄和处理图片的实现
Aug 06 Python
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
Jun 06 Python
基于python实现坦克大战游戏
Oct 27 Python
python编写函数注意事项总结
Mar 29 Python
Python的property属性详细讲解
Apr 11 Python
python+selenium+chrome批量文件下载并自动创建文件夹实例
Apr 27 #Python
解决pycharm编辑区显示yaml文件层级结构遇中文乱码问题
Apr 27 #Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
Apr 27 #Python
python读取yaml文件后修改写入本地实例
Apr 27 #Python
基于SpringBoot构造器注入循环依赖及解决方式
Apr 26 #Python
Python判断字符串是否为空和null方法实例
Apr 26 #Python
如何将PySpark导入Python的放实现(2种)
Apr 26 #Python
You might like
php中{}大括号是什么意思
2013/12/01 PHP
memcache命令启动参数中文解释
2014/01/13 PHP
php中error与exception的区别及应用
2014/07/28 PHP
点图片上一页下一页翻页效果
2008/07/09 Javascript
浅谈javascript中for in 和 for each in的区别
2015/04/23 Javascript
基于jquery实现图片相关操作(重绘、获取尺寸、调整大小、缩放)
2015/12/25 Javascript
javascript制作照片墙及制作过程中出现的问题
2016/04/04 Javascript
基于BootStrap Metronic开发框架经验小结【七】数据的导入、导出及附件的查看处理
2016/05/12 Javascript
JS产生随机数的几个用法详解
2016/06/22 Javascript
jQuery插件HighCharts绘制2D半圆环图效果示例【附demo源码下载】
2017/03/09 Javascript
require.js与bootstrap结合实现简单的页面登录和页面跳转功能
2017/05/12 Javascript
Angular 4.X开发实践中的踩坑小结
2017/07/04 Javascript
vue-cli项目如何使用vue-resource获取本地的json数据(模拟服务端返回数据)
2017/08/04 Javascript
Vue页面骨架屏的实现方法
2018/05/22 Javascript
在react中使用vuex的示例代码
2018/07/30 Javascript
vuex存储复杂参数(如对象数组等)刷新数据丢失的解决方法
2019/11/05 Javascript
javascript canvas API内容整理
2020/02/16 Javascript
Vue中component标签解决项目组件化操作
2020/09/04 Javascript
Python安装第三方库的3种方法
2015/06/21 Python
Pandas 对Dataframe结构排序的实现方法
2018/04/10 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
2019/09/18 Python
flask实现验证码并验证功能
2019/12/05 Python
如何基于Python代码实现高精度免费OCR工具
2020/06/18 Python
pandas数据分组groupby()和统计函数agg()的使用
2021/03/04 Python
纯CSS绘制漂亮的圆形图案效果
2014/05/07 HTML / CSS
AmazeUI 网格的实现示例
2020/08/13 HTML / CSS
日本面向世界,国际级的免税在线购物商城:DOKODEMO
2017/02/01 全球购物
芬兰灯具网上商店:Nettilamppu.fi
2018/06/30 全球购物
Nordgreen英国官网:斯堪的纳维亚设计师手表
2018/10/24 全球购物
写给学生的新学期寄语
2014/01/18 职场文书
初三学生个人自我评定
2014/04/06 职场文书
小学捐书活动总结
2014/07/05 职场文书
抗洪救灾标语
2014/10/08 职场文书
2015年爱国卫生工作总结
2015/04/22 职场文书
搭讪开场白台词大全
2015/05/28 职场文书
2015年音乐教学工作总结
2015/07/22 职场文书