当前位置: 首页 > news >正文

【从源码角度深度理解 CPython 的垃圾回收机制】:第2课循环引用:标记清除-分代回收

二. 循环引用的终结者:标记-清除(Mark-Sweep)

通过引用计数,我们已经处理了一部分引用个数为0的数据,但是还有一部分循环引用的对象没有被清理。这个如何处理呢?

为了解决循环引用问题,Python 引入了标记-清除(Mark-Sweep)算法,作为引用计数的补充。

2.1 标记-清除的基本原理

标记-清除算法分为两个阶段:

  1. 标记(Mark):从“根对象”(如全局变量、栈上的局部变量)出发,遍历所有可达对象,并给它们打上“存活”标记。
  2. 清除(Sweep):扫描所有被 GC 跟踪的对象,回收那些未被标记的对象(即不可达对象)。

2.2 什么是“根对象”?

“根对象”是程序可以直接访问的起点,包括:

  • 全局变量
  • 当前函数的局部变量
  • 调用栈中的参数
  • 内置模块、类、函数等

GC 从这些“根”出发,像洪水一样“淹没”所有能到达的对象。

2.3 GC 跟踪的对象

并非所有对象都会被 GC 扫描。只有那些可能参与循环引用的容器类对象才会被 GC 跟踪,例如:

  • listdictset
  • 自定义类的实例
  • tuple(如果包含可变对象)

intstrfloat 等原子类型不会被 GC 跟踪,因为它们无法形成循环引用。

你可以通过 gc.is_tracked(obj) 来检查一个对象是否被 GC 跟踪。

a = [1, 2, 3]        # list → 被 GC 跟踪 ✅
b = {'x': a}         # dict → 被 GC 跟踪 ✅
c = MyClass()        # 自定义实例 → 被 GC 跟踪 ✅
d = 42               # int → 不被 GC 跟踪 ❌
e = "hello"          # str → 通常不被跟踪(除非驻留)❌
f = (a, b)           # tuple 包含可变对象 → 被跟踪 ✅
g = (1, 2, 3)        # tuple 只含不可变 → 可能不被跟踪 ❌

举例

import gcprint(gc.is_tracked([1,2,3]))      # True
print(gc.is_tracked(42))           # False
print(gc.is_tracked("hello"))      # False (通常)
print(gc.is_tracked(( [1], )))     # True

2.4 细节追问

  1. 问题总结

问题

http://www.dtcms.com/a/324445.html

相关文章:

  • 7.企业级AD活动目录的备份与恢复策略
  • 【celeba】-数据集的介绍
  • 驱动电路设计
  • Ollama+Deepseek+Docker+RAGFlow打造自己的私人AI知识库
  • 【软件测试】性能测试 —— 工具篇 JMeter 介绍与使用
  • AI质检数据准备利器:基于Qt/QML 5.14的图像批量裁剪工具开发实战
  • 升级 JDK 17 碰到的请求 https 问题
  • 从0开始的中后台管理系统-5(userList页面功能实现)
  • 自测电脑有没有木马
  • 深度学习周报(8.4~8.10)
  • 使用binutils工具解析目标文件符号表(叁)
  • Datawhale AI夏令营 多模态RAG环境问题
  • 海关 瑞数 失信企业 逆向 分析 后缀 rs
  • es查询小结
  • CSS优先级、HTTP响应状态码
  • BGP综合大实验
  • 人工智能-python-机器学习-模型选择与调优实战指南:从交叉验证到朴素贝叶斯分类
  • 为wordpress顶部header.php文件中调用不同的标题和摘要
  • 学习中的杂项知识
  • 在Word和WPS文字一页中实现一栏与多栏混排
  • 打靶日常-upload-labs(21关)
  • MyBatisPlus插件原理
  • Java 虚拟机运行时数据区组成详解
  • 【Vue2与Vue3的核心区别】响应式、运行时、编译器
  • 医学统计(随机对照研究分类变量结局数据的统计策略2)
  • 五种 IO 模型与阻塞 IO
  • Redis一站式指南二:主从模式高效解决分布式系统“单点问题”
  • 对话式BI有什么用?不懂技术也能用对话式BI搞定业务报表
  • 面对信号在时频平面打结,VNCMD分割算法深度解密
  • AMS1117-3.3 低压差线性稳压器 (LDO) 3.3V芯片 引脚图中文资料