详解Python3的垃圾回收机制

Python的垃圾回收机制主要包括两个部分:引用计数和循环引用检测。

引用计数法

内部采用 引用计数法,为每个对象维护引用次数,并据此回收不在需要的垃圾对象。

由于引用计数法存在重大缺陷,循环引用时由内存泄露风险,因此Python还采用 标记清除法 来回收在循环引用的垃圾对象,循环引用检测。

此外,为了提高垃圾回收(GC)效率,Python还引入了 分代回收机制

循环引用检测

引用计数主要处理的是基本数据类型和简单的数据结构,如列表和字典等。然而,如果两个对象互相引用,即使它们被其他任何对象所引用,引用计数也不会减少到0,因为它们互相保持了对方的引用计数。为了处理这种情况,Python引入了一个循环检测器,该检测器通过定期执行一个循环垃圾回收的算法,找出并清除引用计数无法归零的对象。

循环检测器包括两个主要部分:一个是用于寻找所有可疑的循环引用的分代垃圾回收机制,另一个是用于确实并清除引用计数无法归零的对象的循环垃圾回收机制。

这两种机制一起工作,可以有效地回收Python中不再使用的对象,从而防止内存泄漏。

请注意,虽然这些是Python的默认垃圾回收机制,但是也可以通过Python的gc模块显式地控制垃圾回收的行为。

引用计数增加

  • 对象被创建
  • 如果有新的对象使用该对象
  • 作为容器对象的一个元素
  • 被作为参数传递给函数

引用计数减少

  • 对象的引用被显示的销毁
  • 新对象不在使用该对象
  • 对象从列表中被移除,或者列表对象本身被销毁
  • 函数调用结束

引用机制优点

  • 简单
  • 实时性:一旦没有引用,内存就直接释放了。

引用机制缺点

  • 维护引用计数消耗资源
  • 循环引用的问题无法解决

a = [1,2]
b = [3,4]
a.append(b) #b的计数器2
b.append(a) #a的计数器2
del a
del b

标记-清除法

1. 对比引用计数法

       引用计数法能够解决大多数垃圾回收的问题,但是遇到两个对象相互引用的情况,del语句可以减少引用次数,但是引用计数不会归0,对象也就不会被销毁,从而造成了内存泄漏问题。针对该情况,Python引入了标记-清除机制

2. 循环引用

        引用计数这种管理内存的方式虽然很简单,但是有一个比较大的瑕疵,即它不能很好的解决循环引用问题。如上图所示:对象 A 和对象 B,相互引用了对方作为自己的成员变量,只有当自己销毁时,才会将成员变量的引用计数减 1。因为对象 A 的销毁依赖于对象 B销毁,而对象 B 的销毁与依赖于对象 A 的销毁,这样就造成了我们称之为循环引用(Reference Cycle)的问题,这两个对象即使在外界已经没有任何指 针能够访问到它们了,它们也无法被释放。

        遍历活跃对象,第一步需要找出 根对象 ( root object )集合。所谓根对象,就是指被全局引用或者在栈中引用的对象,这部分对象是不能被删除的。因此,我们将这部分对象标记为绿色,作为活跃对象遍历的起点。

        根对象本身是 可达的 ( reachable ),不能删除;被根对象引用的对象也是可达的,同样不能删除;以此类推。我们从一个根对象出发,沿着引用关系遍历,遍历到的所有对象都是可达的,不能删除。而没有被标色的对象就是 不可达 ( unreachable )的垃圾对象,可以被安全回收。循环引用的致命缺陷完美解决了!

分代回收机制

Python的垃圾回收机制不会保证立即释放内存,可能会在程序运行过程中或程序结束后执行。因此,虽然Python的垃圾回收机制可以帮助优化内存使用,减少内存泄漏和不必要的内存分配,但是开发者仍然需要注意编写高效的代码,避免不必要的内存消耗。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/373061.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot3,启动时间缩短 10 倍!

前面松哥写了一篇文章和大家聊了 Spring6 中引入的新玩意 AOT(见Spring Boot3 新玩法,AOT 优化!)。 文章发出来之后,有小伙伴问松哥有没有做性能比较,老实说,这个给落下了,所以今天…

2024最新版MySQL安装使用指南

2024最新版MySQL安装使用指南 Installation and Usage Guide to the Latest Oracle MySQL in 2024 By JacksonML 1. MySQL简介 MySQL是世界上最受欢迎的开源数据库之一。MySQL属于Oracle(甲骨文)公司的产品,其具有强大的功能,但…

Vue-53、Vue技术vuex使用

vuex 是什么 1、概念 专门在Vue 中实现集中式状态(数据)管理的一个Vue 插件,对vue 应用中多个组件的共享状态进行集中式的 管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信。2、…

《动手学深度学习(PyTorch版)》笔记7.5

注:书中对代码的讲解并不详细,本文对很多细节做了详细注释。另外,书上的源代码是在Jupyter Notebook上运行的,较为分散,本文将代码集中起来,并加以完善,全部用vscode在python 3.9.18下测试通过&…

rclone基础命令解析及实战

rclone命令解析及实战 1 rclone介绍:远程同步工具 rclone是一个开源的远程数据同步工具,由Golang编写,旨在在不同平台的文件系统和多种类型的对象存储产品之间提供数据同步功能。 它支持超过 40 种不同的云存储服务,包括 Amazon S…

常用Hallmark及KEGG、GO基因查询

文献:The Molecular Signatures Database (MSigDB) hallmark gene set collection - PMC (nih.gov) GSEA | MSigDB | Browse Human Gene Sets (gsea-msigdb.org)通过msigdb数据库可以查看各个Hallmark、KEGG、GO具体包含的基因细节。 Hallmark nameProcess categor…

C# Socket通信从入门到精通(21)——Tcp客户端判断与服务器断开连接的三种方法以及C#代码实现

前言 我们开发的tcp客户端程序在连接服务器以后,经常会遇到服务器已经关闭但是作为客户端的我们不知道,这时候应该应该有一个机制我们可以实时监测客户端和服务器已经断开连接,如果已经断开了连接,我们应该及时报警提示用户客户端和服务器已经断开连接,本文介绍三种可以监…

DAY12之滑动窗口最大值

今天内容有点超乎我的能力 直接放卡哥的讲解了 239. 滑动窗口最大值 - 力扣&#xff08;LeetCode&#xff09; 先看超时的暴力解法 class Solution { public:vector<int> maxSlidingWindow(vector<int>& nums, int k) { vector<int>result; for(int …

新手养猫怎么挑选宠物空气净化器?猫用空气净化器测评推荐!

对于养猫的朋友来说&#xff0c;猫咪掉毛绝对是一个令人头痛的问题。猫毛和皮屑在室内飘散&#xff0c;不仅遍布各个角落&#xff0c;而且清理起来也相当费劲。尤其是那些顽固的猫毛&#xff0c;更是令人烦恼。更糟糕的是&#xff0c;这些毛发可能引起人体过敏反应&#xff0c;…

6.s081 学习实验记录(五)traps

文章目录 一、RISC-V assembly简介问题 二、Backtrace简介注意实验代码实验结果 三、Alarm简介注意实验代码实验结果 一、RISC-V assembly 简介 git checkout traps&#xff0c;切换到traps分支user/call.c 文件在我们输入 make fs.img 之后会被汇编为 call.asm 文件&#xf…

libev-ev_timer定时器的理解

1.相关说明 本文主要自己对于libev的ev_timer定时器的代码流程梳理&#xff0c;主要有ev_timer结构体定义变量的初始化&#xff0c;定时器变量的参数设置&#xff0c;定时器变量的使用 2.相关代码流程 下面是图片 3.相关实现代码 main.c #include <stdio.h> #include…

流浪动物救助|基于Springboot的流浪动物救助平台设计与实现(源码+数据库+文档)

流浪动物救助平台目录 目录 基于Springboot的流浪动物救助平台设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、动物信息管理 3、商品评论管理 4、公告信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设…

使用html2canvas截图踩坑总结

年底的移动端H5需求中&#xff0c;再次用到了html2canvas这个插件&#xff0c;这个插件主要是用来对网页进行截图&#xff0c;在项目需求中&#xff0c;有个交互的点&#xff0c;就是通过用户操作&#xff0c;将页面的内容截图保存下来&#xff0c;方便用户传播扩散。 H5说明&…

【初读论文】

这里写目录标题 万字长文解析深度学习中的术语面向小白的深度学习论文术语&#xff08;持续更新&#xff09;deepsolo不懂的知识pipelinebaselineRoI(Region of Interest)分类问题中的正例负例指示函数&#xff08;indicator function&#xff09;模型性能评估指标&#xff08;…

nginx+flask+Gunicorn反代理服务拿不到真实IP的解决

背景 本人在宝塔linux环境,要部署flask的简单后端并且用Ngnix反代理,用Gunicorn框架部署。(o(╥﹏╥)o中间磕磕绊绊总算部署上去了,需要了解Gunicorn怎么部署的朋友,评论区留言,我加补一篇介绍)。但是但是,我发现 其 accesslog日志里竟然是 127.0.0.1。这怎么能…

模拟钉钉官网动画

实现思路&#xff1a;利用粘性定位sticky&#xff0c;以及滚动事件实现。首先我们应该设置滚动动画开始位置和结束位置 &#xff0c;然后根据位置计算透明度或者transform&#xff0c;scale的值。 首先根据上述图线计算属性值&#xff0c;代码如下&#xff1a; function creat…

Python基础知识:Python模块

所谓模块(Module)&#xff0c;就是一种以“.py”为命名后缀的Python 文件&#xff0c;里面包含着很多集成的函数&#xff0c;可以很方便的被其他程序和脚本导入并使用。 如果模块理解为一辆汽车&#xff0c;我们使用汽车可以完成驾驶等工作&#xff0c;那么代码就是一个个细小…

Linux内存管理:(十二)Linux 5.0内核新增的反碎片优化

文章说明&#xff1a; Linux内核版本&#xff1a;5.0 架构&#xff1a;ARM64 参考资料及图片来源&#xff1a;《奔跑吧Linux内核》 Linux 5.0内核源码注释仓库地址&#xff1a; zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 外碎片化发生时&#xff0c;页面分配…

day21网页布局

文章目录 块元素和行内元素列表标签表格标签媒体元素页面结构分析iframe内联框架 块元素和行内元素 块元素&#xff1a;无论内容多少&#xff0c;该元素独占一行。(p标签、h1~h6…) 行内元素&#xff1a;内容撑开宽度&#xff0c;左右都是行内元素的可以排在一行。&#xff08…

Java基础---IO知识以及常用的API整理

Java 中的 I/O&#xff08;输入/输出&#xff09;是一个核心概念&#xff0c;涉及数据的读取和写入。Java I/O API 提供了丰富的类和接口&#xff0c;用于处理不同类型的数据流。了解 Java I/O 的基础知识对于面试和日常编程都非常重要。所以今天来整理一下&#xff1a; 1. Fi…