Python 基础:垃圾回收

liftword4个月前 (03-20)技术文章35

垃圾回收这是 Python 内存管理系统的重要组成部分。虽然引用计数适用于大多数场景,但垃圾回收解决了仅引用计数不够的情况,尤其是在处理循环引用时。了解垃圾回收的工作原理将有助于您编写高效、内存安全的 Python 程序。

什么是垃圾回收?

垃圾回收是 Python 回收不再使用的内存的方法。它与引用计数一起工作,以确保从内存中删除未使用的对象。

关键思想如下:

  • 当对象的引用计数达到零时,Python 的内存管理器会销毁该对象并回收内存。
  • 但是,在更复杂的情况下(如循环引用),垃圾回收会介入进行清理。

垃圾回收是自动的,并定期在后台运行,但 Python 还提供了以编程方式控制和检查垃圾回收的方法。

循环引用和引用计数的限制

什么是循环引用?

当两个或多个对象相互引用时,将发生循环引用,从而创建一个循环。让我们举个例子:

这里:

  • A.B 指向 B,B.A 指向 A。这将创建一个循环引用

引用计数失败的原因

现在,如果我们删除对 ab 的引用:

对象 ab 仍在相互引用:

  • a 的引用计数为 1(来自 B.A)。
  • B 的引用计数为 1(来自 A.B)。

由于它们的引用计数不为零,因此 Python 的引用计数机制无法销毁它们,从而将它们无限期地留在内存中。这就是垃圾回收的用武之地。

垃圾回收器如何处理循环引用

垃圾回收器通过分析内存中跟踪的所有对象来识别循环引用。如果它找到一组仅相互引用(并且无法访问)的对象,它会中断循环并回收内存。

这可以防止内存泄漏,当不再需要的内存未释放时,会发生内存泄漏。

使用gc模块

Python 的 gc 模块提供了多种工具来与垃圾回收器进行交互。以下是一些关键功能:

启用或禁用垃圾回收

垃圾回收默认处于启用状态,但您可以根据需要禁用它(例如,出于性能原因):

手动触发垃圾回收

您可以使用 gc.collect() 手动运行垃圾回收器:

检查跟踪对象

垃圾回收器跟踪内存中的所有对象。您可以使用 gc.get_objects() 检查这些内容:

常见问题和最佳实践

性能影响

  • 垃圾回收可能会带来较小的性能开销,因为它会定期扫描内存以查找循环引用。
  • 除非绝对必要,否则请避免禁用它。

禁用垃圾回收的风险

  • 如果在未确保代码没有循环引用的情况下关闭垃圾回收,则存在内存泄漏的风险。

调试内存问题

  • 使用 gc.get_objects()gc.collect() 等工具来识别和解决内存问题。
  • 如果您创建具有复杂关系的自定义类,请进行全面测试。

垃圾回收是 Python 内存管理系统的重要组成部分。它通过解析循环引用和防止内存泄漏来补充引用计数。虽然它是自动的,并且在大多数情况下几乎不需要干预,但 Python 的 gc 模块提供了在需要时检查和控制垃圾回收的工具。

相关文章

分享一个文件整理使用Python小脚本(删除相同文件减小内存占用)

写在前面:脚本作用:在目标文件夹中筛选出大小相同的文件,并打印在屏幕上,这样可以快速找出相同文件,释放硬盘内存。前期部署:安装python并做好配置环境变量(基础)先上代码:import osfrom...

一文掌握Python内存管理

Python中的内存是由Python内存管理器(Python memory manager)来管理的,它涉及到一个包含所有Python对象和数据结构的私有堆(heap)。Python内存管理器有不同的...

喂!你这个python的内存是不是爆了?喏,拿这个去测试一下看看

你是否曾经为python程序的内存占用问题头疼不已?是否觉得内存泄漏、对象占用过多内存等问题难以排查?别急,今天我要介绍一个神器——pympler,让你轻松搞定python内存分析!01什么是pymp...

Python性能优化: 探索提高Python代码性能的技术

Python是一门强大而灵活的编程语言,但在处理大规模数据和性能要求严苛的场景下,性能优化显得尤为重要。本教程将带你探索提高Python代码性能的技术,包括使用生成器、列表推导式等减少内存占用,以及通...

10个Python进阶问题

1 .解释Python支持的文件处理模式。Python中有三种文件处理模式:只读(r)、只写(w)、读写(rw)和追加(a)。因此,如果您以读取模式打开文本文件。前面的模式变为“rt”表示只读,“wt...

Python 也有内存泄漏?

1. 背景前段时间接手了一个边缘视觉识别的项目,大功能已经开发的差不多了,主要是需要是优化一些性能问题。其中比较突出的内存泄漏的问题,而且不止一处,有些比较有代表性,可以总结一下。为了更好地可视化内存...