首页 > 编程语言 >Python的垃圾回收机制

Python的垃圾回收机制

时间:2024-07-05 15:58:40浏览次数:15  
标签:refchain Python list 回收 链表 对象 计数器 垃圾 引用

Python的垃圾回收机制

引入计数器为主,标记清除和分代回收为辅

1.引入计数器

环状双向链表refchain

在python程序中创建的任何对象都会放在refchain链表中

当python程序运行时,会根据数据类型的不同找到其对应的结构体,根据结构体中的字段来进行创建相关的数据,然后将对象添加到rechain双向链表中

在C源码中有两个关键的结构体:PyObject,PyVarObject

每个对象中有ob_refcent就是引用计数器,默认值为1,当其他变量引用对象时,引用计数器就会发生变化。

# 引用
a = 999
b = a   # 相当于ob_refcent为2
​
del b   # b变量删除:b对应对象计数器的引用-1
​
#当一个对象的引用计数器为0时,意味着没有人在使用这个对象了,这个对象就是垃圾,进行垃圾回收
#回收:1对象从rechain链表移除。2:将对象销毁,内存归还。
​

只用计数器会出现bug 循环引用&&交叉感染

会导致变量永远都在内存中,无法清除

2.标记清除

目的:为了解决引用计数器循环引用的不足

实现:在python的底层再去维护一个链表。这个链表专门放那些可能存在循环引用的对象(list/dict/tuple/set)。 # 元素中还有可能再放其他元素的

在python内部,某种情况下触发,回去扫描可能存在循环引用的链表中的每一个元素,检查是否有循环引用,如果有让双方的引用计数器-1;如果是0则垃圾回收。

问题:

什么时候扫描?

可能存在循环引用的链表扫描的代大。要扫描每一个元素,耗时久

3.分代回收

将可能存在循环引用的对象维护成3个链表:(在refchain中检测到可循环对象就放入0代)

0代:0代中的对象个数达到700个则扫描一次。(扫描,将引用计数器-1如果不等于0,则将对方升级放入1代)

1代:0代如果扫描十次则一代扫描一次。()

2代:1代扫描十次则二代扫描一次。

4.小结

在python中维护了一个叫refchain的双向链表,这个链表存储创建了所有的对象,每种类型的对象中都有一个ob_refcnt引用计数器的值,引用的个数进行+1,-1,最后当引用计数器变为0时进行垃圾回收(对象销毁,refchain中移除)。

但是在python中对于可以有多个元素组成的对象可能会存在循环引用的问题,为了解决这个问题python又引入了标记清除和分代回收,在其内部为4个链表,

refchain 0代 1代 2代

在源码内部达到各自的阈值时,就会触发扫描链表进行标记清除的动作(有循环则各自-1)。

5.Python缓冲池

5.1池(int)

对于整数对象,解释器会对常用的小整数进行缓存,这样可以提高性能和节省内存。具体而言,对于范围在 -5256 之间的整数,Python会缓存这些对象,使得同一值的整数对象共享同一个内存地址。这种优化是为了减少频繁使用的小整数对象的创建和销毁开销。

5.2 free_list(float/list/tuple/dict)

当一个对象的引用计数器为0时,理应进行回收,实际不会回收,而是放到free_list的链表中当缓存。以后再去创建对象时,不再重新开辟内存,而是直接使用free_list。

v1 = 3.14  # 开辟内存,内存存储结构体中定义的那几个值,并且保存到refchain中。
del v1  # refchain中移除,将对象添加到free_list中(比如存80个浮点类型数),free_list满了则销毁
v9 = 9999.99  # 不会重新开辟内存,直接去free_list中获取对象,将对象内部数据初始化,再放到refchain中

标签:refchain,Python,list,回收,链表,对象,计数器,垃圾,引用
From: https://blog.csdn.net/qq_66448696/article/details/140211043

相关文章

  • python中logging
    Python的logging模块是一个用于记录应用程序日志消息的标准模块。它非常强大且灵活,允许你记录各种级别的日志消息,并配置输出格式、日志的存储位置以及处理日志的不同方式。以下是logging模块的基本介绍和用法。defcreate_logger(log_file):log_format='%(asctime)s......
  • 为什么现在的AI编程师都是用Python来编程?
    前言: 在当今AI大火的时节,涌入了一大批AI编程师,和AI训练师!显而易见他们都是用的Python语言来编程的。当然AI也给我们的工作带来了很多便利,比如AI绘画,写文章,视频剪辑,脚本创做等等方面现在都可以来用AI来协助我高效完成工作。那么我们来看看现在的AI编程师为什么都用Python语言......
  • python基础汇总(1)
    开始可以借鉴阿里腾讯开发规范——实际中运用会大体相近1、注释#:单行注释‘’‘’‘’或者“”“”“”:多行注释2、标识符合法:ABC、ABC_123、姓名、_123不合法:123、1ABC、if(保留字)、init(预定义标识符)(1)当标识符用作模块名时,应尽量短小,并且全部使用小写字母,可以使......
  • 《python机器学习从入门到高级》
    《python机器学习从入门到高级》分类算法:引言我们在之前的文章已经介绍了机器学习的一些基础概念,当拿到一个数据之后如何处理、如何评估一个模型、以及如何对模型调参等。接下来,我们正式开始学习如何实现机器学习的一些算法。回归和分类是机器学习的两大最基本的问题,对于......
  • python数据结构(树和二叉树)
    树非线性结构一对多根结点(无前驱)多个叶子结点(无后继)其他数据元素(一个前驱,多个后驱)树与二叉树转换树与二叉树均可用二叉链表作为存储结构,则以二叉链表为媒介可导出树之间的一个对应关系-----即给定一颗树,可以找到唯一一颗二叉树与之对应。把树转化为二叉树步骤一:加线......
  • Box,一个字典操作python库
     Box介绍Box是一个让字典操作变得异常简单与直观,支持通过属性访问字典内容的库。 特点概述属性访问Box允许用户像访问对象属性一样访问字典的值,提升了代码的可读性和易用性。无缝嵌套自动将嵌套的字典转换为Box对象,使得处理复杂字典结构变得轻而易举。灵活性......
  • Python速通(条件语句)
    (牛牛的选择)牛牛在牛客网经过了两次笔试分别获得了Tencent和Alibaba的面试资格,不巧的是这两次面试的时间冲突了。两家公司牛牛都想去,他决定通过笔试的成绩判断去参加哪家公司的面试。现在输入两行浮点数,分别表示牛牛在Tencent和Alibaba的笔试成绩,请比较两个成绩,输出笔试成绩较高的......
  • 小白也能看懂的Python基础教程(9)
    目录Python文件操作1、文件操作概述什么是文件?文件操作包含哪些内容呢?文件操作的作用2、文件的基本操作open()打开函数mode访问模式详解读操作相关方法read()方法:readlines()方法:readline()方法:file读取文件之readfile读取文件之readlines和reanline相对和绝对......
  • ipython的使用技巧整理
    IPython是一个强大的交互式Python环境,提供了许多高级功能和快捷键,以下是非常详细的IPython使用技巧整理,覆盖了每个知识点(但本文是基于有一定基础的同学看的):IPython的使用基础:一、安装与基本操作安装Anaconda建议直接下载安装Anaconda,其中包含丰富的库,以及我们需要使用......
  • python爬取的数据存放在哪
    大家好,本文将围绕python数据爬取有哪些库和框架展开说明,python爬取数据保存到数据库是一个很多人都想弄明白的事情,想搞清楚python爬取数据存入数据库需要先了解以下几个事情。经常游弋在互联网爬虫行业的程序员来说,如何快速的实现程序自动化,高效化都是自身技术的一种沉淀的......