Python中GC的垃圾回收算法分析

python内存回收gc模块 阅读详情

相信大家在面试中常常会碰到有关垃圾回收的问题,的确,Python和其他很多编程语言一样,都自带垃圾回收机制。本文主要和大家来分析一下Python中的垃圾回收算法。首先我们要知道,GC计算机术语指的是垃圾回收。而Python中的垃圾回收是以引用计数为主,但是为了弥补其算法的不足,所以又引入了标记-清除和分代收集算法为辅。
在这里插入图片描述

一、引用计数

刚开始学习Python的时候总是会有人告诉你,万物皆对象是一大特色。在Python中每一个对象的核心就是一个结构体PyObject,它的内部有一个引用计数器(ob_refcnt)。

// object.h
struct _object {
Py_ssize_t ob_refcnt; # 引用计数值
struct PyTypeObject *ob_type;
} PyObject;

引用计数的意思就是,一个对象在它刚被New出来呱呱(gugu不是guagua)坠地的时候因为被New方法引用了所以他的引用计数就是1,如果它被引用(也就是在之前的基础上 例如:b=a,被丢入函数列表等等被引用就会在引用计数上加1),如果引用它的对象被删除的时候(在之前的基础上DEL b)那么它的引用计数就会减少一一直到当它的引用计数变为0的时候,垃圾回收机制就会找上门做掉它(回收),脑补一下 :开门我是查水表的。
  
优点:高效,易于实现,实时性。一旦没有引用,内存就直接释放了。处理回收内存的时间分摊到了平时,对象有确定的生命周期。
 
缺点:维护性高,虽然简单实时,但是额外占用了一部分资源,虽然逻辑简单,但是比较麻烦。另外它还有不能解决的情况:循环引用,如下所示:

a=[1,2]
b=[2,3]
a.append(b)
b.append(a)
DEL a
DEL b

二、标记-清除算法

标记-清除就是用来解决循环引用的问题的只有容器对象才会出现引用循环,比如列表、字典、类、元组。 首先,为了追踪容器对象,需要每个容器对象维护两个额外的指针, 用来将容器对象组成一个链表,指针分别指向前后两个容器对象,方便插入和删除操作。试想一下,现在有两种情况:
 
A:

a=[1,3]
b=[2,4]
a.append(b)
b.append(a)
del a
del b

B:

a=[1,3]
b=[2,4]
a.append(b)
b.append(a)
del a

在标记-清除算法中,有两个集中营,一个是root链表,另外一个是unreachable链表。对于情景A,原来再未执行DEL语句的时候,a,b的引用计数都为2,但是在DEL执行完以后,a,b引用次数互相减1。a,b陷入循环引用的圈子中,然后标记-清除算法开始出来做事,找到其中一端a,开始拆这个a,b的引用环,去掉以后发现,a,b循环引用变为了0,所以a,b就被处理到unreachable链表中直接被做掉。

对于情景B,简单一看那b取环后引用计数还为1,但是a取环,就为0了。这个时候a已经进入unreachable链表中,已经被判为死刑了,但是这个时候,root链表中有b。如果a被做掉,那世界上还有什么正义… ,在root链表中的b会被进行引用检测引用了a,如果a被做掉了,那么b就…凉凉,一审完事,二审a无罪,所以被拉到了root链表中。

三、分代回收算法

了解分类回收,首先要了解一下,GC的阈值,所谓阈值就是一个临界点的值。随着你的程序运行,Python解释器保持对新创建的对象,以及因为引用计数为零而被释放掉的对象的追踪。从理论上说,创建==释放数量应该是这样子。但是如果存在循环引用的话,肯定是创建>释放数量,当创建数与释放数量的差值达到规定的阈值的时候,分代回收机制就开始起作用了。
 
垃圾回收=垃圾检测+释放。Python将所有的对象分为0,1,2三代;所有的新建对象都是0代对象;当某一代对象经历过垃圾回收,依然存活,就被归入下一代对象。Python在创建对象之前,会创建一个链表,零代链表,只不过这个链表是空的。每当你创建一个对象,Python便会将其加入到零代链表。

Python是一门非常不错的编程语言,薪资待遇高、就业前景好。即使你不想出去上班,也可以利用Python在家做兼职(比如爬取客户需要的数据、量化交易、代写程序等)。

如果你对Python感兴趣,想通过学习Python获取更高的薪资,那下面这套Python学习资料一定对你有用!

😝朋友们如果有需要的话,可以V扫描下方二维码免费领取🆓

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

#### **一、Python学习路线**

image-20230619144606466

python学习路线图1

二、Python基础学习
1. 开发工具

2. 学习笔记

在这里插入图片描述

3. 学习视频

在这里插入图片描述

三、Python小白必备手册

图片

四、数据分析全套资源

在这里插入图片描述

五、Python面试集锦
1. 面试资料

在这里插入图片描述

在这里插入图片描述

2. 简历模板

在这里插入图片描述

** 因篇幅有限,仅展示部分资料,添加上方即可获取** />
python:gc --- 垃圾回收器接口 阅读详情

相关推荐

Python垃圾回收机制

Python垃圾回收机制

qq_59464154的博客 1072

python垃圾回收 (GC) 机制

Python 能够自动进行内存分配和释放,但了解 python 垃圾回收 (garbage collection, GC) 的工作原理可以帮助你写出更好更快的 Python 程序。Python 使用两种算法进行垃圾回收,分别是引用计数 (Reference Counting) 和分代回收 (Generational garbage collection)。 引用计数 引用计数,简而言之就是如果没有变量引用某一对象,那么该对象将会被回收。Python 中的每个变量都是对对象的引用,而不是对象本身。例如,赋值语

jeffery0207的博客 1万+

嵌入式:简单的service框架

在嵌入式中,我们获取一个资源、设置一个变量、更新数据的话最直接的方式就是直接调用一个函数。这样的写法也可以满足基本的功能,前提是这个系统是只要一个任务,只有一个while(1)如图1.1。图1.1当有两个或者两个以上的任务的时候,同时调用一个函数(设置一个状态值、操作同一个资源、操作指针等行为)的流程如图1.2。图1.2当两个任务同时操作一个资源的时候,就会有重入的问题,会导致想不到的异常问题(数据不对、指针异常等)。

stupid的博客 986

Python的垃圾回收机制,详解Python的GC体系

垃圾回收即简称为GC,是Python,Java等高级语言所使用的内存回收机制,由虚拟机帮助我们管理内存,让它自动把我们去追踪和回收内存中的对象。没有作用的对象就是垃圾,虚拟机就是扫地机器人,在某个时机自动帮我们清除垃圾。区别于C和C++这种让用户自己进行内存管理的方式,由虚拟机代用户管理内存。让用户自己进行内存管理的方式固然自由方便,但是对编码者编程功底和程序理解的要求也要更高。而且这样也可能导致大量难以发现并且危害巨大的bug,如造成内存泄漏,产生野指针和悬挂指针等。

weixin_64569462的博客 3076

BLDC六步换相驱动实战:从霍尔真值表到PWM调速的代码实现

本文详细解析了BLDC六步换相驱动原理,从霍尔真值表解读到PWM调速的代码实现,提供了基于STM32的实战方案。重点介绍了霍尔信号解码、换相状态机设计以及PWM动态调速策略,帮助开发者快速掌握无刷电机驱动技术。

weixin_28273593的博客 212

碳纳米管NRAM:突破5纳米制程的下一代存储技术

在半导体存储领域,非易失性存储器和随机存取存储器是两大基础技术方向。传统DRAM速度快但断电易失,NAND Flash非易失但写入慢、寿命有限,两者在先进制程下都面临物理极限挑战。碳纳米管作为一种新型纳米材料,凭借其优异的导电性、机械强度和尺寸微缩潜力,为存储技术革新提供了物理基础。基于碳纳米管的NRAM技术,通过控制纳米管间的可逆接触实现电阻状态切换,兼具DRAM级速度和Flash的非易失性,同时具备近乎无限的擦写寿命和出色的CMOS工艺兼容性。这项技术不仅能满足5纳米以下制程的存储需求,在数据中心缓存、

weixin_42576804的博客 428

python垃圾回收机制(GC机制)

python垃圾回收机制 一、引入 解释器在执行定义变量的语法时,会申请内存空间来存放变量值,每一块内存空间都有其唯一的内存地址,我们在前面说过,变量名并不是存放的变量值,而是存放的内存地址,通过访问内存地址,就能找到对应的值,而内存的容量是有限的,因此必然会有一些内存空间被回收然后再提供给用户使用,这就是回收内存空间。 那么回收哪些值所在的内存空间呢?或者说,存放哪些值的内存就应该被回收呢?答案:没有用了的值就会变成垃圾就会被回收掉。那么问题又来了,哪些值是没有用的呢?怎么判断一个值是否有用,是否无用呢?

weixin_45620619的博客 2497

XTDrone——无人机基于2D激光Lidar进行二维运动规划(细节提醒以及相关报错解决)

本文介绍了在Ubuntu 20.04系统无人机基于ROS Noetic实现HectorSLAM二维激光建图与运动规划的完整流程。主要内容包括:安装必要ROS依赖库;修改HectorSLAM的launch文件,解决坐标系转换问题;配置地图发布参数以避免覆盖已建地图;启动PX4仿真环境与XTDrone通信模块;最后通过2D导航目标点实现无人机运动规划。文中详细说明了各步骤的关键配置修改,并提供了处理常见错误(如TF转换超时)的解决方案。实现了从激光SLAM建图到路径规划的过程。

weixin_45390670的博客 996

Python教程:GC垃圾回收

1.小整数对象池:Python为了优化速度,使用了小整数对象池, 避免为整数频繁申请和销毁内存空间。Python 对小整数的定义是[-5, 257) 这些整数对象是提前建立好的,不会被垃圾回收 2.大整数对象池:每一个大整数,均创建一个新的对象 3.intern机制:假如要创建n个对象的是一样的字符串,那么python只会创建一个内存空间来存储,其他对象都是引用,但如果字符串中出现空格或其他符号就表示为不同的对象

Python编程学习的博客 1258

Python爬虫应对Cloudflare防护:5秒盾+Turnstile验证码实战(AST反混淆+指纹模拟,成功率95%)

Cloudflare 5秒盾+Turnstile验证码的防护核心,是通过“前端JS挑战+多维度指纹校验”确认请求来源的真实性。用AST反混淆还原CF的验证逻辑,避免执行无用代码导致的验证失败;基于真实浏览器采集指纹,确保指纹维度100%匹配真人环境;结合轻量级JS引擎和自动化工具,模拟完整的浏览器执行环境。该方案的绕过成功率可达95%(剩余5%主要是IP或请求频率导致的风控),适用于绝大多数部署CF防护的网站。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1718

【stm32+K210项目】基于K210与STM32协同工作的智能垃圾分类系统设计与实现(完整工程资料源码)

本系统采用SG90舵机Maix Bit摄像头STM32C8T6主控板以及LX_TRIG_MP3_V6.0语音播报模块,构建了一套高效的智能垃圾分类系统,综合运用了图像识别、语音播报及精准控制技术。SG90舵机负责控制垃圾桶的开盖操作。该舵机通过接收PWM信号来实现转动,内部有一个基准电路产生周期为20ms的PWM信号,通过外部脉冲信号的控制(高电平时间在0.5ms至2.5ms之间),使得舵机的输出轴转动到指定位置。舵机内的位置反馈电位计。

嵌入式技术开发 5103

Python垃圾回收和GC模块

同样,并不是所有的对象都会被垃圾回收器追踪到,例如像用户创建类这样的复杂对象总是被跟踪的,但是一个只保存简单对象,例如整数和字符串的字典不会被跟踪,因为在那个特定的字典中没有对象持有对其的引用,不持有对其它元素的引用的简单对象,如整数和字符串,永远不会被跟踪。一般来说,垃圾回收器不需要调整就可以运行良好,Python 的开发团队选择了常见情况的默认值,如果你确实需要调整垃圾回收的工作方式,你可以使用 Python 的 gc 模块,gc 模块为垃圾回收器的行为提供了编程接口,并可配置对哪些对象进行跟踪。

梦想橡皮擦,专栏100例写作模式先行者,现象级专栏 《Python 爬虫 100 例》作者、《滚雪球学 Python 专栏》原创者 1万+

Python爬虫实战:使用最新技术爬取新华网新闻数据

在当今信息爆炸的时代,网络爬虫技术已经成为获取互联网数据的重要手段。作为国内权威新闻媒体,新华网每天发布大量高质量的新闻内容,这些数据对于舆情分析、市场研究、自然语言处理等领域具有重要价值。本文将详细介绍如何使用Python最新技术构建一个高效、稳定的新华网新闻爬虫系统。本文详细介绍了如何使用Python最新技术栈构建一个高效、稳定的新华网新闻爬虫系统。我们从基础爬虫开始,逐步添加了代理支持、用户代理轮换、请求延迟、重试机制、动态页面渲染、数据存储等高级功能,最终实现了一个生产可用的分布式爬虫系统。

2201_76125261的博客 1771

4、垃圾回收机制(gc 模块)

垃圾回收机制(gc 模块)

融码一生:专注 Python、C/C++、Linux、机器学习 & 深度学习、NLP、算法领域分享 1463

Kafka 性能优化与常见问题排查

Kafka 的高性能依赖于合理的集群设计、参数优化与高效的监控体系。生产环境中,应重点关注I/O 瓶颈、分区规划、Producer/Consumer 参数调优,并通过监控与排查手段快速定位问题,从而保障 Kafka 在实时场景下的稳定运行。

X2829352498的博客 235

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

python得垃圾回收机机制gc

一.为什么要有垃圾回收 解释器在执行到定义变量得语法时,会申请内存空间来存放变量得值,但是由于内存空间是有限得,所以这就涉及到了内存回收问题了,当一个变量值没有用了(简称垃圾),这种时候就应该回收掉这个变量值得内存空间。 二.什么是垃圾回收机制 垃圾回收机制(简称GC)是Python解释器自带一种机,专门用来回收不可用的变量值所占用的内存空间 三.为什么要用垃圾回收机制 程序运行过程中会申请大量的内存空间,而对于一些无用的内存空间如果不及时清理的话会导致内存使用殆尽(内存溢出),导致程序崩溃,因此管理内存是

weixin_43999932的博客 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

python垃圾回收机制

Python分代回收中的阈值是指两个用于判断对象是否应该被垃圾回收的阈值:第一个是每代的阈值,第二个是总体的阈值。每代的阈值指的是每个分代的垃圾回收阶段执行的次数。每当达到每代的阈值时,Python会触发分代垃圾回收。总体的阈值则是用于在分代回收期间控制是否触发全局垃圾回收(即回收所有代)的阈值。当某个分代的垃圾回收次数达到总体的阈值时,Python会触发全局垃圾回收。

leshen_88的博客 3623

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

深入垃圾回收:理解GC的核心算法与实现

在计算机科学中,垃圾回收是一种自动化内存管理技术。它的主要任务是检测和回收不再被程序使用的内存,从而避免内存泄漏,并确保系统资源的高效利用。在没有GC的编程世界里,开发者必须手动管理内存。这意味着,每当分配内存时,开发者需要明确释放内存空间,避免内存泄漏、悬垂指针等复杂问题的出现。然而,这种手动管理非常容易出错。GC的引入为程序员解放了大量精力,使得内存管理更加简洁、安全。《垃圾回收的算法与实现》这本书深入探讨了GC的各类算法及其在不同编程语言中的具体实现。

四楼没电梯的专栏 2004

Go 语言编程 — GC 垃圾回收

目录 文章目录目录GC常见的 GC 实现方式参考文档 GC GC(Garbage Collection,垃圾回收)是一种自动内存管理的机制。相对于 C、C++ 以及 Rust 等编程语言使用手动的方式管理内存。 当程序向操作系统申请的内存不再需要时,垃圾回收主动将其回收并供其他代码进行内存申请时候复用,或者将其归还给操作系统,这种针对内存级别资源的自动回收过程,即为垃圾回收。而负责垃圾回收的程序组件,即为垃圾回收器。 一方面,程序员受益于 GC,无需操心、也不再需要对内存进行手动的申请和释放操作,GC 在程

烟云的计算 2305

Python:gc模块使用和垃圾回收机制

简介:gc模块即Python中垃圾回收模块,它提供可选的垃圾回收器的接口。同时提供对回收器找到但是无法释放的不可达对象的访问。由于 Python 使用了带有引用计数的回收器,如果你确定你的程序不会产生循环引用,你可以关闭回收器。可以通过调用 gc.disable() 关闭自动垃圾回收。 Python中垃圾回收: python的垃圾回收器把所有对象分类为三代,其依据是对象在多少次垃圾回收后幸存。新建对象会被放在最年轻代(第 0 代)。如果一个对象在一次垃圾回收后幸存,它会被移入下一个较老代。由于第 2 代是最

we chat:玩转测试开发 5063

Python_垃圾回收机制之GC模块③

一.垃圾回收机制 Python中的垃圾回收是以引用计数为主,分代收集为辅。 1、导致引用计数+1的情况 对象被创建,例如a=23 对象被引用,例如b=a 对象被作为参数,传入到一个函数中,例如func(a) 对象作为一个元素,存储在容器中,例如list1=[a,a] 2、导致引用计数-1的情况 对象的别名被显式销毁,例如del a 对象的别名被赋予新的对象,例如a=24 一个对象......

G_SANGSK的博客 6万+

2、Garbage collection(GC,垃圾回收)

Garbage collection(GC,垃圾回收)

融码一生:专注 Python、C/C++、Linux、机器学习 & 深度学习、NLP、算法领域分享 1083

GC(垃圾回收)解析

GC ,全称 Garbage Collection ,即垃圾回收,是一种自动内存管理的机制。当程序向操作系统申请的内存不再需要时,垃圾回收主动将其回收并供其他代码进行内存申请时候复用,或者将其归还给操作系统,这种针对内存级别资源的自动回收过程,即为垃圾回收。而负责垃圾回收的程序组件,即为垃圾回收器。一方面,程序员受益于 GC,无需操心、也不再需要对内存进行手动的申请和释放操作,GC 在程序运行时自动释放残留的内存。

General_zy的博客 2950

Python 垃圾回收机制 GC 深度解析(三)

Python 的垃圾回收机制综合运用了引用计数、标记 - 清除算法和分代回收算法,有效地解决了内存管理中的各种问题。引用计数提供了基本的内存回收功能,标记 - 清除算法解决了循环引用问题,分代回收算法提高了回收效率。同时,Python 的gc模块为开发者提供了灵活的控制和监控垃圾回收过程的手段。

Android开发领域创作者 1122

理解Python的GC垃圾回收机制,让你写出更好的代码

GC(Garbage Collection)的好处 GC(垃圾回收机制)毫无疑问是编程史上的一次革命,在没有垃圾回收机制的C/C++时代,经常造成内存泄漏(反正我C++是被内存泄漏玩哭了)而使程序员bug改到崩溃。所以当GC出现时,人们沸腾了,因为程序员再也不需要考虑内存泄漏的问题,可以好好关心业务代码了,这是多么可喜可贺的事啊。就像你家雇了个保姆,你现在可以专心做喜欢做的事,不用去打扫了一样,...

漏れた玩具博客 1091

Python垃圾回收GC

注:可以用sys.getrefcount(名称)来查看变量的引用计数。 1.⼩整数对象池[-5,257)共⽤对象,常驻内存 2.单个字符共⽤对象,常驻内存 3.单个单词,不可修改,默认开启intern机制,共⽤对象,引⽤计数为0, 则销毁 4.python中GC垃圾回收有两种方式:引⽤计数机制为主,标记-清 除和分代收集两种机制为辅的策略 (一)引用计数,当ob_refcnt为0,即引用计数为0时...

年少不知植发贵的博客 409
上一篇: Python,空闲时间兼职的首选语言
下一篇: Python的五大特性,提高你的工作效率
大模型应用场景
博客等级 码龄5年 7667粉丝 1350原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值