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

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.xdnf.cn/news/16623.html

相关文章:

  • DAY21 常见的降维算法
  • 项目质量如何把控?核心要点分析
  • 【Pycharm】Python最好的工具
  • 【ComfyUI学习笔记04】案例学习:局部重绘 - 上
  • 服务器分布式的作用都有什么?
  • ABP VNext + GraphQL Federation:跨微服务联合 Schema 分层
  • Apache Ignite 的连续查询(Continuous Queries)功能的详细说明
  • Python的生态力量:现代开发的通用工具与创新引擎
  • 【PHP】Swoole:CentOS安装Composer+Hyperf
  • ⭐ Unity 异步加载PPT页面 并 首帧无卡顿显示
  • 【EDA】Calma--早期版图绘制工具商
  • AR辅助前端设计:虚实融合场景下的设备维修指引界面开发实践
  • 2025年06月03日 Go生态洞察:语法层面的错误处理支持
  • Java 11 新特性详解与代码示例
  • Spring Boot中的this::语法糖详解
  • 递归推理树(RR-Tree)系统:构建认知推理的骨架结构
  • 力扣热题100--------240.搜索二维矩阵
  • Generative AI in Game Development
  • 板凳-------Mysql cookbook学习 (十二--------7)
  • 亚马逊 Vine 计划:评论生态重构与合规运营策略
  • C++基础:模拟实现queue和stack。底层:适配器
  • 解决mac下git pull、push需要输入密码
  • MySQL(配置)——MariaDB使用
  • 探索 Vim:Linux 下的高效文本编辑利器
  • SBB指令的“生活小剧场“
  • Linux 系统启动与 GRUB2 核心操作指南
  • Kafka运维实战 17 - kafka 分区副本从 1 增加到 3【实战】
  • 作物生长模型Oryza V3实战17:土壤数据集
  • 【RH134 问答题】第 9 章 访问网络附加存储
  • 2025年Solar应急响应公益月赛-7月笔记ing