首页 > 编程语言 >老猿理解的Python中的垃圾回收机制

老猿理解的Python中的垃圾回收机制

时间:2022-10-02 15:33:33浏览次数:46  
标签:计数 Python 回收 对象 垃圾 老猿 引用

垃圾回收机制(GC)是所有高级语言的标准配置之一。在一定程度上可以优化编程语言的数据处理效率,提高编程软件开发软件的安全性能。Python中的垃圾回收机制主要基于引用计数,并辅以令牌删除和生成收集。自动管理内存中的无效数据!

以下是三者之间的区别:

1. 引用计数

Python默认的垃圾收集机制是引用计数,这是一种由George E. Collins在1960年首次提出的算法,近60年后仍被许多编程语言使用。

引用计数的核心原理是:每个对象保持一个ob_ref字段,用来记录当前被引用对象的个数,每当新的引用点指向该对象时,引用计数ob_ref加1,每当对象引用失败计数ob_ref减1,一旦对象引用计数为零,该对象立即被回收,对象占用的内存空间将被释放。

引用计数有明显的优点:

效率高,实时性好,可以在最短的时间内获得并计算对象引用的次数,对象具有一定的生命周期,操作简单,易于实现。

引用计数也有明显的缺点:

  • 维护引用计数消耗资源,维护引用计数的次数与引用分配成正比,这与Mark和Sweep不同,后者基本上与回收的内存数量有关。
  • 循环引用问题无法解决。A和B彼此引用,但没有对A和B的任何外部引用,两者的引用计数都是1,但显然应该被回收。

为了解决这两个致命弱点,Python引入了以下两种GC机制。

2. 标记和清除

标记清除算法是一种基于跟踪GC技术的垃圾收集算法。它主要是一种对可能产生循环引用的对象的检测机制。它分为两个阶段:标记阶段,GC标记所有“活动对象”;第二个阶段,回收未标记的“不活动对象”。

那么GC如何确定哪些对象是活动的,哪些是不活动的呢?

对象通过引用(指针)连接,形成有向图。对象构成有向图的节点,引用关系构成有向图的边。从根对象开始,沿有向边遍历对象。可达对象被标记为活动对象,不可达对象被标记为要删除的非活动对象。根对象是全局变量、调用堆栈和寄存器。

3.分代垃圾回收

分代采集是基于标记去除技术,是一种空间交换时间的操作方式。Python内存根据对象的生存时间分为不同的集合,每一个集合称为一代,Python内存可以分为三个“代”,分别在较年轻的一代(0)、s(1)、s(2)中,它们是对应的三个列表,它们的垃圾回收频率和对象随着生存时间的增加而减少。

新创建的对象被分配给年轻代。当年轻代列表总数达到上限时,触发Python垃圾收集来收集可收集的对象,不能收集的对象被移到中代,以此类推。老一代中的对象是存活时间最长的对象。甚至在整个系统的生命周期内。

标签:计数,Python,回收,对象,垃圾,老猿,引用
From: https://www.cnblogs.com/lyyzhi/p/16748842.html

相关文章

  • python识别ico hash值
    用python识别icohash值,通过shodan搜索icohash值的网站,网上较为多流行的是用python2写的,但考虑到现在都是python3,这个脚本也跑不起来,所以自己重写了一个python3版本 需......
  • python 查询字符串编码方式
    In[6]:chardet.detect(b'\xc8\xcb\xc9\xfa\xbf\xe0\xb6\xcc\xa3\xac\xce\xd2\xd3\xc3Python')Out[6]:{'encoding':'GB2312','confidence':0.99,'language':'Chinese......
  • 4个Python推导式相关的开发技巧
    对于数据科学,Python通常被广泛地用于进行数据的处理和转换,它提供了强大的数据结构处理的函数,使数据处理更加灵活,这里说的“灵活性”是什么意思?这意味着在Python中总是有......
  • python2与python区别汇总
    目录输入与输出range使用区别字符编码区别输入与输出python2与python3中两个关键字的区别python2中input方法需要用户自己提前指定数据类型写什么类型就是什么类型ra......
  • python关于算法题的输入
    关于Python算法题的输入处理最近在准备蓝桥杯,打算报Python组,所以开始尝试用Python刷算法题。【python&ACM输入输出的处理:sys.stdin.readline().strip().split())】上......
  • supervisor /usr/lib64/python2.7/socket.py line: 224
    配置了supervisor之后,写好了配置,最后发现一直报这个错误,supervisorerror:<class‘socket.error’>,[Errno2]Nosuchfileordirectory:file:/usr/lib64/python2.7/......
  • python代码报错No module named numpy问题
    1一般在“控制面板+cmd”中安装numpy在命令行窗口中输入"pipinstallnumpy"此时安装的numpy并不在python的目录行中则会出现Nomodulenamednumpy报错,即使是在python程序......
  • python 打靶法求解一维谐振子薛定谔方程
    1.理论公式一维谐振子薛定谔方程:\[-\frac{\hbar^2}{2m}\frac{d^2}{dx^2}\psi(x)+\frac{1}{2}m\omega^2x^2\psi(x)=E\psi(x).\]即\[\frac{d^2}{dx^2}\ps......
  • 使用 Python 处理 Json 数据
    一、引言:什么是JSONJSON(JavaScriptObjectNotation)是一种很常用的数据格式,它常常用在web应用程序中。它可以表示结构化的数据。下面是常见的JSON文件结构{......
  • Python 学习笔记
    随便写点看起来不太容易记住的知识感觉python吊打c++运算优先级: 来点例子理解一下foryearinrange(2018,2050):if(year%4==0)and(year%100!=0)......