Python中的垃圾回收gc.collect()详细指南

 更新时间:2026年02月24日 11:18:02   作者:bj_zhb  
gc.collect()是 Python中gc(Garbage Collector,垃圾回收)模块里的一个非常重要的函数,下面介绍关于它“怎么用”、“什么时候用”以及“原理”的详细指南,感兴趣的朋友跟随小编一起看看吧

Python中的垃圾回收gc.collect()

gc.collect() 是 Python 中 gc(Garbage Collector,垃圾回收)模块里的一个非常重要的函数。它的主要作用是 手动触发 Python 的垃圾回收机制,强制清理内存中不再被使用的对象

虽然 Python 有自动的内存管理,但在处理大量数据或特定情况下,手动调用它能帮你释放内存。

下面是关于它“怎么用”、“什么时候用”以及“原理”的详细指南:

1. 最基础的用法

你只需要导入 gc 模块,然后调用该函数即可:

import gc
# 你的代码...(比如处理了大量数据)
# 手动触发垃圾回收
released_objects = gc.collect()
print(f"成功清理了 {released_objects} 个不可达对象")

返回值gc.collect() 会返回一个整数,表示这次回收过程中发现并清理的不可达对象(unreachable objects)的数量

2. 为什么需要gc.collect()?(它解决了什么问题)

Python 的内存管理主要依赖引用计数(Reference Counting)。当一个对象的引用次数变为 0 时,Python 会立刻回收它。
但是,引用计数有一个致命弱点:循环引用(Circular References)

看下面这个例子:

import gc
class Node:
    def __init__(self, name):
        self.name = name
# 创建两个对象
a = Node("A")
b = Node("B")
# 让它们互相引用(造成循环引用)
a.friend = b
b.friend = a
# 尝试删除它们
del a
del b
# 此时,a和b虽然在程序里找不到了,但它们互相还在引用对方!
# 它们的引用计数不是0,Python默认的引用计数机制无法回收它们,这会导致内存泄漏。
# 强行调用 gc.collect() 可以找出并清理这种循环引用的垃圾
n = gc.collect()
print(f"清理了 {n} 个由于循环引用产生的垃圾")

3. 高级用法:分代回收(Generations)

Python 的垃圾回收器把对象分为 3 代(Generation 0, 1, 2):

  • 第 0 代:新创建的对象。
  • 第 1 代:经历过一次垃圾回收依然存活的对象。
  • 第 2 代:存活了很久的“老”对象。

你可以给 gc.collect() 传入一个参数 generation(0、1 或 2),指定只清理某一代及其以下的垃圾:

import gc
# 只检查并清理第 0 代(速度最快)
gc.collect(0) 
# 检查并清理第 0 代和第 1 代
gc.collect(1)
# 检查所有代(0, 1, 2),等同于 gc.collect(),最彻底但也最耗时
gc.collect(2)

4. 什么时候应该使用gc.collect()?

在 95% 的日常编程中,你不需要用到它,因为 Python 的自动垃圾回收已经足够聪明了。但在以下场景,手动调用非常有用:

  1. 深度学习/机器学习训练时
    在处理大型张量(Tensors)或每个 Epoch 训练结束后,内存可能会飙升。这时调用一下 gc.collect(),配合清空显存(如 torch.cuda.empty_cache()),可以有效防止 OOM (Out Of Memory)。
  2. 处理超大文件或数据集
    比如在一个 for 循环中,每次循环读取一个几个 GB 的 CSV 文件,处理完后,在进入下一次循环前手动 gc.collect(),确保上一个文件的内存被彻底释放。
  3. 长时间运行的后台服务(Daemon)
    为了防止由于微小的循环引用导致的缓慢内存泄漏,可以在定时任务中(比如每小时)手动触发一次。

5. ⚠️ 注意事项与副作用

  • 不要过度使用:垃圾回收是一个很耗时的过程(它需要扫描内存中的对象)。如果把它放在高频的循环(如每秒执行一千次的 while 循环)里,会让你的程序变得非常卡顿。
  • 导致程序暂停(Stop-the-world):在执行 gc.collect() 的那几毫秒/几秒内,你的 Python 程序其他逻辑是暂停执行的。

总结:在做完一次大规模的内存操作、或者删除了巨大的对象之后,才是使用 gc.collect() 的最佳时机。平时就放心交给 Python 自动处理吧!

到此这篇关于Python中的垃圾回收gc.collect()的文章就介绍到这了,更多相关python 垃圾回收gc.collect()内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python pandas求方差和标准差的方法实例

    Python pandas求方差和标准差的方法实例

    标准差(或方差),分为 总体标准差(方差)和 样本标准差(方差),下面这篇文章主要给大家介绍了关于pandas求方差和标准差的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-08-08
  • OpenMV与JSON编码问题解析

    OpenMV与JSON编码问题解析

    这篇文章主要介绍了OpenMV与JSON编码,JSON是一种简洁高效的交换数据的格式,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2022-06-06
  • PyTorch Tensor创建实现

    PyTorch Tensor创建实现

    本文主要介绍了PyTorch Tensor创建实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • pandas 实现将两列中的较大值组成新的一列

    pandas 实现将两列中的较大值组成新的一列

    这篇文章主要介绍了pandas 实现将两列中的较大值组成新的一列,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Python在Matplotlib图中显示中文字体的操作方法

    Python在Matplotlib图中显示中文字体的操作方法

    这篇文章主要介绍了Python在Matplotlib图中显示中文字体的方法,本篇主要针对在Ubuntu系统中,matplotlib显示不了中文的问题,尤其是在无法安装系统字体的情况下,解决Python绘图时中文显示的问题。需要的朋友可以参考下
    2019-07-07
  • Numpy中np.random.rand()和np.random.randn() 用法和区别详解

    Numpy中np.random.rand()和np.random.randn() 用法和区别详解

    这篇文章主要介绍了Numpy中np.random.rand()和np.random.randn() 用法和区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • python基于turtle绘制几何图形

    python基于turtle绘制几何图形

    turtle又称为海龟绘图,是Wally Feurzeig, Seymour Papert 和 Cynthia Solomon 于 1967 年所创造的 Logo 编程语言的python实现。turtle是基于tkinter图形界面设计的。
    2021-06-06
  • Python实现监控键盘鼠标操作示例【基于pyHook与pythoncom模块】

    Python实现监控键盘鼠标操作示例【基于pyHook与pythoncom模块】

    这篇文章主要介绍了Python实现监控键盘鼠标操作,结合实例形式分析了Python基于pyHook与pythoncom模块的键盘、鼠标事件响应及日志文件操作相关实现技巧,需要的朋友可以参考下
    2018-09-09
  • 使用Python协程实现支持断点续传的文件下载器

    使用Python协程实现支持断点续传的文件下载器

    协程是一种多方协同的工作方式,协程不是进程或线程,其执行过程类似于 Python 函数调用,协程是对使用 async 关键字定义的异步函数的调用,本文介绍了如何使用Python协程实现支持断点续传的文件下载器,需要的朋友可以参考下
    2025-09-09
  • Keras中的两种模型:Sequential和Model用法

    Keras中的两种模型:Sequential和Model用法

    这篇文章主要介绍了Keras中的两种模型:Sequential和Model用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06

最新评论