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

Python的垃圾回收机制

Python 的垃圾回收机制(GC),是自动内存管理的核心部分,它负责回收不再使用的对象所占用的内存,防止内存泄漏。Python 主要通过以下三种机制来进行垃圾回收:

一、引用计数

原理:

每个对象都有一个引用计数器,记录有多少个变量或结构引用该对象。

  • 每当有一个新的引用对象指向该对象时,引用计数加1;
  • 当某个引用被删除或重新赋值时,引用计数减1;
  • 当引用计数变为0时,表示没有引用再使用该对象,对象立即被释放。

示例:

a = [1, 2, 3]   # 引用计数为1
b = a           # 引用计数为2
del a           # 引用计数减1 → 变为1
del b           # 引用计数减1 → 变为0,对象被回收

缺点:

  • 无法处理循环引用问题
a = []
b = []
a.append(b)
b.append(a)
# 此时 a 和 b 相互引用,即使 del a, del b 后它们的引用计数也不为0

二、标记-清除

解决的问题

用于解决循环引用的问题

工作流程

  • 标记阶段:从根对象(如全局变量、栈中的变量等)出发,递归追踪所有可达的对象,并将它们标记为存活
  • 清除阶段:遍历堆中所有对象,未被标记的对象视为不可达,将被回收

应用对象

只适用于支持容器类型(如 list、dict、class 实例等),因为这些对象可以包含其他对象,从而形成循环引用。

三、分代回收

思想基础

大多数对象的生命周期都很短(即弱代假说),所以将对象生命周期按生存周期分成不同 ,对不同代的对象进行不同程度的垃圾回收。

Python 中的三代:

  • 第 0 代(Gen 0):新创建对象;
  • 第 1 代 (Gen 1):经历一次 GC 后还活着的对象;
  • 第 2 代 (Gen 2):多次 GC 后任然存活的对象

回收频率

  • Gen0 被检查的最频繁
  • Gen1 次之
  • Gen2 最少

控制方式

可以通过 gc 模块查看和调整代的阈值

import gc
print(gc.get_threshold())  # 默认值通常是 (700, 10, 10)

表示:

  • 当第 0 代对象数量达到 700 时触发第 0 代GC;
  • 每执行10 次第0代 GC,触发一次第1代GC;
  • 每执行10次第一代 GC,触发一次第二代GC。

四、gc 模块

import gc gc.enable() # 开启自动GC(默认) gc.disable() # 关闭自动GC gc.collect() # 手动触发一次完整的GC gc.set_threshold(800, 10, 10) # 设置GC阈值

import gcgc.enable()        # 开启自动GC(默认)
gc.disable()       # 关闭自动GC
gc.collect()       # 手动触发一次完整的GC
gc.set_threshold(800, 10, 10)  # 设置GC阈值
http://www.dtcms.com/a/304716.html

相关文章:

  • PyTorch 数据类型和使用
  • 【C++算法】72.队列+宽搜_二叉树的最大宽度
  • Qt 多线程数据库操作优化
  • 图像认知与OpenCV | Day5:图像预处理(4)
  • 关于 Apache Ignite 中 Job 调度(Job Scheduling)与冲突控制(Collision Control) 的机制说明
  • 嵌入式中间件-uorb解析
  • GC8870刷式直流电机驱动器详解:3.6A高功率PWM控制芯片
  • 中间件二进制部署文档
  • java导出pdf(使用html)
  • kotlin StateFlow的两个问题和使用场景探讨
  • Coze Studio概览(三)--智能体管理
  • 虚拟机网络修复
  • centos服务器安装minio
  • ./build.sh:行1: g++: 未找到命令的错误问题在centos操作系统下面如何解决
  • C# SerialPort和ISerialServer的区别
  • 编程算法在金融、医疗、教育、制造业等领域的落地案例
  • 【nerf处理视频数据】Instant-NGP项目NeRF模型训练数据集准备指南
  • Sentinel实现限流和熔断降级
  • 基于YOLOP与GAN的图像修复与防御系统设计与实现
  • sqli-labs通关笔记-第24关 SQL二次注入(单引号闭合)
  • Scikit-learn高级功能与Python实践
  • 军工堡垒机国产化突围:打破国外垄断的三大技术流派
  • vue3项目搭建
  • VIKOR(Multi-criteria Optimization and Compromise Solution)简介与简单示例
  • 无人机图传:让天空视角 “触手可及”
  • Apache Ignite 的分布式原子类型(Atomic Types)
  • 【高阶版】R语言空间分析、模拟预测与可视化高级应用
  • 解密犯罪时间 - 华为OD统一考试(JavaScript 题解)
  • 自定义View和动画学习记录 抓娃娃机View
  • DataParallel (DP) DistributedDataParallel (DDP)