首页 > 编程语言 >python 垃圾回收

python 垃圾回收

时间:2023-08-19 22:12:09浏览次数:48  
标签:python 元素 ob 回收 链表 PyObject 垃圾 引用

【第1题】 Pythonn内存管理以及垃圾回收机制 - 武沛齐 - 博客园 (cnblogs.com)

https://www.bilibili.com/video/BV1F54114761/

 

 元祖

 总结:

为了回收内存,每个对象都加入了refchain双向环向链表,对象被引用+1,del掉-1,等于0内存就被回收,这个叫引用计数器ob_refcnt;但是像列表这种互相引用的,会出现循环引用问题。导致计数器不为0的情况,内存无法回收。所以出现了标记清除。

再维护一个链表,把可能存在循环引用(list,tuple,dict,set)的放入这个链表里,集中管理。某种情况下,触发扫描,然后是引用计数器那一套。但是扫描比较耗时,所以把标记清除一个链表拆分成3个,谓之曰分代回收。

不需要标记清除的链表,而是再维护三个链表0代,1代,2代。这个三个链表触发机制是,先0代,对象存refchain的时候,也放一份到0代里,当0代里的对象数量达到700及以上时,出发内存回收。0代执行10次才会执行一次1代。1代执行10次才会执行一次2代。

以上就是引用计数器,标记清除和分代回收的概念。引用计数器是最核心和根本的,而分代回收是标记清除的具体实现和优化。所以最后维护了4个链表,refchain、0代、1代和2代。这里强调一下,refchain放的是所有对象。

进一步优化就是后面的缓存机制:池和free_list。都是为了避免常用对象重复创建和销毁的。

顺带提一下,对象底层实现:Python中所有类型创建对象时,底层都是与PyObject和PyVarObject结构体实现,一般情况下由单个元素组成对象内部会使用PyObject结构体(float)、由多个元素组成的对象内部会使用PyVarObject结构体(str/int/list/dict/tuple/set/自定义类),因为由多个元素组成的话是需要为其维护一个 ob_size(内部元素个数)。

  • 2个结构体
    • PyObject,此结构体中包含3个元素。
      • _PyObject_HEAD_EXTRA,用于构造双向链表。
      • ob_refcnt,引用计数器。
      • *ob_type,数据类型。
    • PyVarObject,次结构体中包含4个元素(ob_base中包含3个元素)
      • ob_base,PyObject结构体对象,即:包含PyObject结构体中的三个元素。
      • ob_size,内部元素个数。

 

标签:python,元素,ob,回收,链表,PyObject,垃圾,引用
From: https://www.cnblogs.com/daizichuan/p/17643244.html

相关文章

  • OceanBase-系统回收日志参数验证enable_syslog_recycle和max_syslog_file_count
    作者:刘书盛热衷技术分享、编写技术文档原创作品oceanbase数据库原创内容未经授权不得随意使用、转载请联系小编并注明来源,谢谢!1、参数介绍enable_syslog_recycle     用于是否打开记录启动前的旧日志的开关   max_syslog_file_count  用于设置在回收......
  • python 小案例正则表达式
    正则表达式是一种用于匹配、查找和替换文本的强大工具。在提取网页中的目标数据时,可以使用正则表达式来搜索和匹配特定模式的文本。以下是一个使用正则表达式提取网页中的目标数据的示例代码:importre#网页源代码html="""<divclass="title">正则表达式教程</div><divc......
  • Python分享之python super()
    一、问题的发现与提出在Python类的方法(method)中,要调用父类的某个方法,在Python2.2以前,通常的写法如代码段1:代码段1:classA:def__init__(self):print"enterA"print"leaveA"classB(A):def__init__(self):print"enterB"A.__init__(self)print......
  • Python学习 -- 高阶、闭包、回调、偏函数与装饰器探究
    Python函数作为编程的核心,涵盖了众多令人兴奋的概念,如高阶函数、闭包、回调、偏函数和装饰器。本篇博客将深入研究这些概念,结合实际案例为你解析函数的精妙,以及如何巧妙地运用它们来构建更强大、灵活的程序。高阶函数:进一步探索在上文基础上,再次回顾高阶函数,展示它们如何将函数作为......
  • python+playwright 学习-74 set_extra_http_headers设置浏览器请求头部
    前言大部分网站保存登录状态是用cookies,也有个别网站是在请求头部添加token实现保存登录。playwright可以使用set_extra_http_headers()方法设置浏览器请求头部参数set_extra_http_headers()方法设置头部参数headers,字典键值对fromplaywright.sync_apiimportsync_pla......
  • 学生成绩登录系统python(简单的登录)
    根据上课学的内容写一个学生登录系统登录成功后输入成绩操作100=优++90-99优80-90良好70-60一般50-60差50以下渣渣生其余分数为作弊行为#作业:根据上课学的内容写一个学生登录系统登录成功后#输入成绩操作100=优++90-99优80-90#良好70-60一般50-60差5......
  • python - base64转图片
    折腾了base64转png弄了很久,使用以下代码进行转换后图片一直打不开importbase64imgData='data:image/png;base64,/9j/4AAQSkZJRgABAQAAAQABAAD后面省略'imgData=imgData.split(',')[1]imgData=base64.b64decode(imgData)withopen('test.png','wb')as......
  • 【补充】Python中实现单例模式的六种常见方法
    【补充】Python中实现单例模式的六种常见方法【1】类属性:classSingleton:instance=None@classmethoddefgetInstance(cls):ifcls.instanceisNone:cls.instance=Singleton()returncls.instance使用类属性保存实......
  • python机器学习经典算法代码示例及思维导图(数学建模必备)
    最近几天学习了机器学习经典算法,通过此次学习入门了机器学习,并将经典算法的代码实现并记录下来,方便后续查找与使用。这次记录主要分为两部分:第一部分是机器学习思维导图,以框架的形式描述机器学习开发流程,并附有相关的具体python库,做索引使用;第二部分是相关算法的代码实现(其实就是......
  • python+playwright 学习-73 page.wait_for_selector()
    前言网页上的元素有不同状态,有些元素本来不在DOM里,点击某个按钮后才出现。有些元素是本来就已经在DOM里是隐藏的状态,点某个按钮后才变成显示状态。如果我们想让元素到达指定的状态再下一步操作,可以用page.wait_for_selector()方法。page.wait_for_selector()方法wait_for_s......