首页 > 编程语言 >python 之 垃圾回收机制(Garbage Collector,简称 GC)

python 之 垃圾回收机制(Garbage Collector,简称 GC)

时间:2024-03-21 16:02:52浏览次数:39  
标签:Garbage 标记 python 回收 对象 计数 GC 引用 垃圾

垃圾回收机制有三种,主要采用引用计数机制为主,标记-清除和分代回收机制为辅的策略。
其中,标记-清除机制用来解决计数引用带来的循环引用而无法释放内存的问题,分代回收机制是为提升垃圾回收的效率。

1. 引用计数:

Python中的每个对象都有一个引用计数,每当对象被引用时,其引用计数就会增加;当引用被删除或超出作用域时,引用计数就会减少。当对象的引用计数降为0时,该对象就被认为是不再被需要的,Python的垃圾回收器就会将其内存回收。

然而,引用计数并不能解决循环引用的问题。例如,如果两个对象相互引用,那么即使这两个对象实际上不再被其他部分的代码所使用,它们的引用计数也永远不会降为0,因此无法被垃圾回收器回收。

2. 分代收集:

为了解决循环引用的问题,Python的垃圾回收器还采用了分代收集的策略。Python将所有的对象按照它们的“年龄”分为几代,新创建的对象属于第 0代,当这些对象在一次垃圾回收周期中存活下来时,它们就会被移到下一代。随着对象在内存中存在的时间越来越长,它们会被移到更老的代。

在分代收集中,Python的垃圾回收器会优先回收那些属于较年轻代的对象,因为这些对象更可能是临时性的,不再被需要的。而对于较老的代,垃圾回收器会采用一种更加精细的策略来识别并回收不再被需要的对象。

除此之外,Python还提供了一个可选的循环垃圾回收器,用于检测并回收那些由于循环引用而无法通过引用计数回收的对象。这个循环垃圾回收器会在一定条件下被触发,以确保所有的不再被需要的对象都能被正确地回收。

  • 所有的新建对象都是0代对象;

  • 当某一代对象经历过垃圾回收,依然存活,就被归入下一代对象。

  • Python将所有的对象分为0,1,2三代。所有的新建对象都是0代对象。

  • 垃圾回收启动时,一定会扫描所有的0代对象。如果0代经过一定次数垃圾回收,那么就启动对0代和1代的扫描清理。

  • 当1代也经历了一定次数的垃圾回收后,那么会启动对0,1,2,即对所有对象进行扫描。

3. 标记-清除(Mark Phase)

  • 用来解决引用计数机制产生的循环引用,进而导致内存泄漏的问题 。

(1)标记阶段(Mark Phase):

  • 从一组根对象(如全局变量、栈上的局部变量等)开始,递归地访问这些对象引用的所有其他对象。
  • 在访问过程中,对每个访问过的对象做一个“标记”,表示它们是可达的,即它们还在被使用。
  • 如果某个对象没有被标记,那么它就被认为是不可达的,即垃圾对象。

(2)清除阶段(Sweep Phase):

  • 遍历堆中的所有对象。
  • 对于那些未被标记的对象(即垃圾对象),回收它们的内存空间。
  • 可能还需要对内存进行整理,以便连续分配新的对象。
  • 标记-清除算法的优点在于它能够处理循环引用的问题,因为即使两个对象相互引用,只要它们没有被根对象引用,那么在标记阶段它们都不会被标记,从而在清除阶段被回收。

然而,标记-清除算法也有一些缺点:

  • 暂停时间:标记和清除过程需要暂停应用程序的执行,这可能导致应用程序的响应性下降。
  • 内存碎片:清除阶段后,内存空间可能变得不连续,导致内存碎片问题。这可能会影响后续的内存分配效率。
    为了减少暂停时间和内存碎片问题,现代的Python实现(如CPython)可能采用一些优化策略,如增量标记(incremental marking)或分代收集(generational collection)。增量标记允许垃圾回收器在应用程序执行期间分多个小步骤进行标记,从而减少对应用程序的暂停时间。分代收集则是基于对象存活时间的假设,将对象分为不同的代,对不同代的对象采用不同的垃圾回收策略。

标签:Garbage,标记,python,回收,对象,计数,GC,引用,垃圾
From: https://blog.csdn.net/Orange_hhh/article/details/136910006

相关文章

  • python 函数(解包、互相调用、作用域、函数的封装、内置函数:eval()、zip()、open())
    函数解包"""1、函数的注释:参数和返回值在注释里可以自动添加显示,只需手动加说明。2、函数的解包【拆包】:函数的参数要传递数据有多个值的时候,中间步骤拿到数据保存在元组或者列表或者字典里。-传递参数的时候加一个*或者**解包-一次拿到元组列表字典的......
  • 身份证ocr,python身份证识别ocr接口代码,实名认证接口
    基于文字识别技术产物的身份证识别接口现已成熟,通过手机、电脑或者摄像头终端设备拍照或者上传身份证图片即可实现身份证照片上文字的识别,从而提取到身份证信息。翔云除了提供身份证识别接口外,还完善了实名认证接口方案,搭配翔云身份证实名认证接口可谓是效率翻倍。身份证......
  • 基于Python3的数据结构与算法 - 17 哈希表
    一、哈希表哈希表是一个通过哈希函数来计算数据存储位置的数据结构,通常支持如下操作:insert(key,value):插入键值对(key,value)。get(key):如果存在键值对为key的键值对则返回其value,否则返回空值。delete(key):删除键为key的键值对。1.直接寻址法当关键字的全域U比较小......
  • SpringCloud 使用feign进行文件MultipartFile传输
    SpringCloud组件fiegn默认是不支持传递文件的。但是提供了feign-form扩展工具解决方法:步骤一:在消费者服务中加入相关pom依赖。<!--解决SpringCloud组件feign默认是不支持传递文件的--><dependency><groupId>io.github.openfeign.form</groupId>......
  • 通俗易懂解释python和anaconda和pytorch以及pycharm之间的关系
    Python:Python就像是一门编程语言的工具箱,你可以把它看作是一种通用的编程语言,就像是一把多功能的工具刀。你可以使用Python来编写各种类型的程序,就像使用工具刀来制作各种不同的手工艺品一样。Anaconda:Anaconda就像是一个装有不同种类工具的大工具箱。这个工具箱里包括了Py......
  • 学会Python有哪些可以做的兼职?所有途径全在这里了...
    可以干的兼职有好多,主要围绕Python的应用方向来。自媒体现在很多搞技术的都开始进入自媒体领域,比如微信公众号、知乎、B站、抖音、小红书等。这些平台上只要你有流量,你就可以通过广告、播放量、带货等方式赚钱。当然了,自媒体需要积累,如果能够忍受前期0收入0阅读阶段,不断......
  • python statlic lib embedding
    pythonstaticlib因为默认没有编译内置库,因此需要配置setup.local文件,把内置库编译到staticlib。参考:https://wiki.python.org/moin/BuildStatically。(./configure--disable-shared即可)注意是Setup.local,不是Setup.dist*static*#GNUreadline.UnlikepreviousPythoni......
  • Python统计初步
    文章目录基本统计特征区间统计PandaspandasGUIPython科学计算:数组......
  • 更智能的广告素材生成!看A/B测试如何驱动AIGC素材调优
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群前言:AIGC大爆发,引发广告营销行业变革ChatGPT等AI产品引发的AIGC大爆发引起了各行业的震动,其中以图片生成甚至视频生成技术的效果和速度最为令人震撼。也正因如此,AIGC的爆发对一直以创意为核......
  • 2024. 1华为od机试C卷【传递悄悄话】Python
    题目给定一个二叉树,每个节点上站着一个人,节点数字表示父节点到该节点传递悄悄话需要花费的时间。初始时,根节点所在位置的人有一个悄悄话想要传递给其他人,求二叉树所有节点上的人都接收到悄悄话花费的时间。输入描述0920-1-1157-1-1-1-132注:-1表示空节点输出......