Python 库手册:gc 垃圾回收

gc 是 Python 标准库,用于访问和控制垃圾回收(Garbage Collection)机制。Python 内存管理主要依赖引用计数,但引用计数无法回收循环引用对象,gc 库提供接口检测和清理循环引用,从而保证程序内存使用稳定。

gc 对象可用于调试内存泄漏、控制垃圾回收策略以及优化性能。

常见应用场景:

(1)检测循环引用

发现不可达对象仍占用内存时,分析循环引用。

(2)手动垃圾回收

在特定时间点强制触发回收,减少内存峰值。

(3)内存泄漏调试

跟踪未释放对象,排查内存泄漏问题。

(4)性能优化

在性能敏感场景下,控制自动垃圾回收策略。

(5)监控对象生命周期

获取当前可达对象列表和对象数量,用于调试和分析。

◆ ◆

核心概念

1、垃圾回收(Garbage Collection)

Python 自动管理对象内存,主要依赖引用计数。gc 处理无法通过引用计数清理的循环引用对象。

2、可达对象与不可达对象

可达对象:仍被引用,可正常使用。

不可达对象:无法通过任何引用访问,可被回收。

3、自动与手动回收

自动:解释器根据阈值触发回收。

手动:开发者通过 gc.collect() 显式回收。

4、调试功能

gc 提供检测对象、打印垃圾列表、统计内存占用等功能,用于调试复杂内存问题。

◆ ◆

应用举例

例 1:检查垃圾回收是否启用

python 复制代码
import gc
print(gc.isenabled())  # 输出 True 或 False

例 2:手动触发垃圾回收

python 复制代码
import gc
collected = gc.collect()print(f"回收对象数量:{collected}")

例 3:禁用与启用垃圾回收

python 复制代码
import gc
gc.disable()print(gc.isenabled())  # False
gc.enable()print(gc.isenabled())  # True

例 4:获取当前所有可达对象

python 复制代码
import gc
objs = gc.get_objects()print(f"当前可达对象数量:{len(objs)}")

例 5:调试循环引用

python 复制代码
import gc
gc.set_debug(gc.DEBUG_LEAK)  # 开启调试循环引用
class A:    def __init__(self):        self.b = None
a = A()a.b = a  # 循环引用
gc.collect()  # 回收并打印循环引用信息

◆ ◆

常用函数与类速览

gc.enable()

启用自动垃圾回收。

gc.disable()

禁用自动垃圾回收。

gc.isenabled()

检查垃圾回收是否启用。

返回:布尔值。

gc.collect(generation=2)

触发垃圾回收。

参数:generation 指定回收代数(0、1、2)。

返回:被回收对象的数量。

gc.get_objects()

获取当前所有可达对象的列表。

返回:对象列表

gc.get_referrers(*objs)

获取引用指定对象的对象列表。

参数:一个或多个对象。

返回:对象列表。

gc.get_referents(*objs)

获取指定对象引用的对象列表。

参数:一个或多个对象。

返回:对象列表。

gc.set_debug(flags)

设置垃圾回收调试标志。

参数:调试标志(如 gc.DEBUG_LEAK)。

返回:无。

◆ ◆

补充说明

(1)Python 的主要内存回收机制是引用计数,gc 主要针对循环引用对象。

(2)gc 提供的调试功能可以帮助分析内存泄漏,但会增加运行开销。

(3)自动垃圾回收可用 gc.set_threshold() 调整触发阈值,优化性能。

(4)gc.collect() 可以在关键代码段或后台任务结束时显式调用,减少内存占用峰值。

(5)gc 并不管理 C 扩展直接分配的内存,需谨慎处理第三方库对象。

📘 小结

gc 库是 Python 内存管理的重要工具,专门用于处理循环引用和不可达对象。通过启用或禁用自动垃圾回收、手动触发回收以及调试循环引用,可以有效控制程序内存占用,排查内存泄漏问题。gc 在性能优化和内存敏感的应用中尤其重要,是高级 Python 开发者的必备工具。

"点赞有美意,赞赏是鼓励"

相关推荐
卷无止境5 分钟前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂
后端·python
lpfasd1238 分钟前
MediaCrawler 项目深度分析
chrome·python·chrome devtools
Dxy123931021644 分钟前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
bamb001 小时前
一个项目带你入门AI应用开发01
python
0566461 小时前
Python康复训练——常用标准库
开发语言·python·学习
极光代码工作室1 小时前
基于SpringBoot的课程预约系统
java·springboot·web开发·后端开发
骊城英雄1 小时前
基于C#+avalonia ui实现的跨平台点胶机灌胶监控控制上位机软件
开发语言·ui·c#
吾儿良辰2 小时前
一个被BCL遗忘的高性能集合:C# CircularBuffer<T>深度解析
开发语言·windows·c#
昆曲之源_娄江河畔2 小时前
Python如何安装flask, pymssql
开发语言·python·flask·pymssql
土豆.exe2 小时前
Fastjson2 2.0.53 哈希碰撞 RCE:从原理到三种打法
算法·哈希算法