Python 进阶
Python 协程实现原理
dict 和 set 实现原理
Python 线程安全
Python 抽象语法树(AST)
Python 日志输出
Python 扩展入门(一)
Python 程序执行原理
Python 垃圾回收
Python 动态创建类
检查工具
PyFrameObject
yield 生成器工作原理
dict 设计与实现
Python 性能分析原理
PyCodeObject
Python 弱引用
Python 性能分析原理(二)
Python 源码分析(一)
Python Annotated
Python 依赖注入
python freelist
python代码编译成pyc
Python mmap 内存映射文件
Python值得学习的内容
async Future 对象
asyncio loop的实现
asyncio.sleep 的实现
asyncio 原理
Python 代码加密
Python Token类型
Python 扩展入门(二)
Python 性能优化
本文档使用 MrDoc 发布
-
+
首页
Python 垃圾回收
Python的垃圾回收(Garbage Collection,GC)系统主要负责管理Python程序中的内存分配和回收。Python使用了几种机制来实现垃圾回收,包括引用计数和标记-清除算法。了解这些机制可以帮助开发者编写更高效和更可靠的Python代码。 ### 引用计数 > Python中的每个对象都有一个`引用计数(ob_refcnt)`字段,用来记录有多少个引用指向该对象。 - 当对象被创建时,它的引用计数初始化为1; - 如果有新的引用指向该对象,其引用计数就增加; - 如果其中一个引用被删除,其引用计数就减少; - 当对象的引用计数变为0时,意味着没有任何引用指向该对象,就`触发`自动回收这个对象所占用的内存; - 回收不一定是从内存中删除,也有可能是放入 `free_list`中等待下一次使用; 引用计数的优点是简单且实时,可以立即回收不再使用的对象。但它也有缺点,最主要的是无法解决循环引用的问题。如果两个或更多的对象相互引用,它们的引用计数永远不会达到0,即使它们已经不再被其他对象引用。 ### 标记-清除 > 为了解决循环引用问题,Python采用了`标记-清除`算法。这个算法通过标记阶段和清除阶段的工作流程来识别和回收循环引用的对象。 - `标记阶段`:从一个或多个根对象(如全局命名空间中的对象、当前执行栈上的对象等)开始,遍历所有可达的对象。在遍历过程中,每访问一个对象就给它打上一个标记。 - `清除阶段`:扫描所有对象,回收那些在标记阶段没有被标记的对象。这些未被标记的对象就是循环引用的对象,或者是其他无法从根对象通过任何引用路径访问到的对象。 > 由此可以看出,应该有两个链表,一个记录了所有对象,一个记录了可达对象。 ### 分代回收 > Python的垃圾回收还采用了`分代回收`机制,这是一种特殊的标记-清除算法,旨在减少垃圾回收的开销。 Python将所有对象分为三代(代0、代1、代2): - 新创建的对象首先被放入代0中; - 当代0的垃圾回收运行一定次数后,存活的对象会被移动到代1中; - 同样,当代1的回收运行一定次数后,存活的对象会被移动到代2中。 通常,代0的回收最频繁执行,而代2的回收最少执行。这种策略是基于这样一个假设: > 新创建的对象更有可能是短暂的,而长时间存活的对象则更可能继续存活。 通过这些机制,Python的垃圾回收系统能有效的管理内存,即使在面对复杂的数据结构和循环引用时也能保证内存的高效使用。然而,理解这些机制也有助于开发者优化程序性能,特别是在处理大量数据或资源密集型任务时。 ### 从源码理解 > [Python 源码阅读 - 垃圾回收机制](https://wklken.me/posts/2015/09/29/python-source-gc.html) > [Python3-源码剖析(三)-GC垃圾回收](https://yuerer.com/Python3-%E6%BA%90%E7%A0%81%E5%89%96%E6%9E%90(%E4%B8%89)-GC%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6/)
gaojian
2024年4月8日 16:40
分享文档
收藏文档
上一篇
下一篇
微信扫一扫
复制链接
手机扫一扫进行分享
复制链接
关于 MrDoc
觅思文档MrDoc
是
州的先生
开发并开源的在线文档系统,其适合作为个人和小型团队的云笔记、文档和知识库管理工具。
如果觅思文档给你或你的团队带来了帮助,欢迎对作者进行一些打赏捐助,这将有力支持作者持续投入精力更新和维护觅思文档,感谢你的捐助!
>>>捐助鸣谢列表
微信
支付宝
QQ
PayPal
Markdown文件
分享
链接
类型
密码
更新密码