Python垃圾回收机制(笔记)
仅仅供自己复习使用,勿喷
Python垃圾回收机制是一种引用计数为主,分代回收+标记清除为辅的一种回收机制
引用计数
在Python中,任何对象在python内部都会对其计数+1
例如①:a=1(赋值)
②:def func(a)(作为参数传入函数)
③:list = [a,a](放在容器内)
④:b = a(对象被引用)
相反的如果出现下面的情况,计数便会-1
例如①:del a
②从容器中被删除对象
所以当一个对象的引用计数为0时,python会自动将其回收,对象占用的内存空间就会被释放
但是如果一个对象被循环引用,下图代码
以上情况中,C1=A(),C2=A()后引用计数会+1,此时又对其相互赋值,两者再次+1,这时候C1和C2引用计数就是2了,所以在进行del的时候,不会直接为0,而是变成1。
虽然它们两个的对象都是可以被销毁的,但是由于循环引用,导致垃圾回收器都不会回收它们,所以就会导致内存泄露
分代回收
python将内存根据对象的存活时间划分为三代,分别是0代,1代,2代,最开始被创建的对象会被分配至0代中,当0代中对象满了,python垃圾回收机制就会被回收
0代中没有被回收的对象转移到1代中,
以此类推,一般到2代中的对象是存活最久的对象,甚至长期存在在生命周期中
标记清除
标记清除是一种基于追踪回收的一种垃圾回收算法
每个对象之间,是有指针指向的有向图,python会由根节点出发,沿着指针出发,遍历全部对象。
标记清楚有两步
第一部:将会从根节点出发,对每个对象进行访问,如果能访问到,就会进行标记,没访问到则不标记
第二部:把没有被标记的对象进行回收
标记清除算法作为 Python 的辅助垃圾收集技术主要处理的是一些容器对象,比如 list、dict、tuple,instance 等,因为对于字符串、数值对象是不可能造成循环引用问题。Python 使用一个双向链表将这些容器对象组织起来。不过,这种简单粗暴的标记清除算法也有明显的缺点:清除非活动的对象前它必须顺序扫描整个堆内存,哪怕只剩下小部分活动对象也要扫描所有对象。
__EOF__

本文链接:https://www.cnblogs.com/wangchengyang/p/16835053.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)