Python 中的垃圾收集

简介: 【8月更文挑战第24天】

垃圾收集 (GC) 是一种自动内存管理技术,它可以回收不再使用的对象所占用的内存。在 Python 中,GC 由称为引用计数的机制实现。

引用计数

Python 中的每个对象都有一个引用计数器,它跟踪指向该对象的引用数。当一个对象被创建时,其引用计数器被设置为 1。每当一个变量或数据结构引用该对象时,其引用计数器就会增加。当引用该对象的变量或数据结构被销毁时,其引用计数器就会减少。

当一个对象的引用计数器变为 0 时,这意味着不再有变量或数据结构引用该对象,该对象就被视为垃圾。GC 会定期运行,回收所有垃圾对象的内存。

垃圾收集循环

GC 循环是一个后台进程,它定期运行以查找和回收垃圾对象。GC 循环的工作原理如下:

  1. 标记阶段:GC 循环从根对象开始(例如全局变量和栈帧中的局部变量),并标记所有可达的对象。可达对象是指从根对象可以访问的对象。
  2. 清除阶段:GC 循环遍历所有未标记的对象,并将其视为垃圾。GC 循环释放这些对象的内存,并将它们从程序的内存空间中移除。

引用循环

引用循环会阻止 GC 回收对象,即使它们不再被使用。引用循环是指两个或多个对象相互引用,从而导致它们的引用计数器永远不为 0。

例如:

import gc

class MyClass:
    def __init__(self, other):
        self.other = other

# 创建两个相互引用的对象
obj1 = MyClass(None)
obj2 = MyClass(obj1)

# 设置两个对象的引用为 None,但它们仍然相互引用
obj1.other = None
obj2.other = None

# 此时,obj1 和 obj2 都应该被回收,但由于引用循环,它们不会被回收
gc.collect()  # 不会回收 obj1 和 obj2

弱引用

为了解决引用循环的问题,Python 提供了弱引用的概念。弱引用不会增加对象的引用计数器,并且在 GC 循环期间会被忽略。这使得 GC 可以回收具有弱引用的对象,即使它们仍然被其他对象引用。

弱引用可以使用 weakref 模块中的 WeakReference 类来创建。

import weakref

class MyClass:
    def __init__(self, other):
        self.other = weakref.ref(other)

# 创建两个相互引用的对象
obj1 = MyClass(None)
obj2 = MyClass(obj1)

# 设置两个对象的引用为 None,但它们仍然通过弱引用相互引用
obj1.other = None
obj2.other = None

# 此时,obj1 和 obj2 都可以被回收
gc.collect()  # 将回收 obj1 和 obj2

禁用垃圾收集

在某些情况下,可能需要禁用 Python 的 GC。这可以通过设置 PYTHONOPTIMIZE 环境变量为 2 来实现。

PYTHONOPTIMIZE=2 python my_script.py

禁用 GC 会提高程序的性能,但也会增加内存泄漏的风险。因此,不建议在生产环境中禁用 GC。

结论

Python 中的垃圾收集是一种自动内存管理机制,它可以回收不再使用的对象所占用的内存。GC 通过引用计数来实现,并且使用引用循环和弱引用来处理引用循环。虽然 GC 可以极大地简化内存管理,但理解其工作原理对于编写高效且无内存泄漏的 Python 程序非常重要。

目录
相关文章
|
13天前
|
监控 Java 开发者
Python的垃圾收集机制有哪些?
Python的垃圾收集机制有哪些?
|
Java 程序员 Python
Python垃圾回收机制详解:引用计数与循环垃圾收集器
Python垃圾回收机制详解:引用计数与循环垃圾收集器
256 0
|
3天前
|
设计模式 算法 搜索推荐
Python编程中的设计模式:优雅解决复杂问题的钥匙####
本文将探讨Python编程中几种核心设计模式的应用实例与优势,不涉及具体代码示例,而是聚焦于每种模式背后的设计理念、适用场景及其如何促进代码的可维护性和扩展性。通过理解这些设计模式,开发者可以更加高效地构建软件系统,实现代码复用,提升项目质量。 ####
|
2天前
|
机器学习/深度学习 存储 算法
探索Python编程:从基础到高级应用
【10月更文挑战第38天】本文旨在引导读者从Python的基础知识出发,逐渐深入到高级编程概念。通过简明的语言和实际代码示例,我们将一起探索这门语言的魅力和潜力,理解它如何帮助解决现实问题,并启发我们思考编程在现代社会中的作用和意义。
|
2天前
|
机器学习/深度学习 数据挖掘 开发者
Python编程入门:理解基础语法与编写第一个程序
【10月更文挑战第37天】本文旨在为初学者提供Python编程的初步了解,通过简明的语言和直观的例子,引导读者掌握Python的基础语法,并完成一个简单的程序。我们将从变量、数据类型到控制结构,逐步展开讲解,确保即使是编程新手也能轻松跟上。文章末尾附有完整代码示例,供读者参考和实践。
|
3天前
|
人工智能 数据挖掘 程序员
Python编程入门:从零到英雄
【10月更文挑战第37天】本文将引导你走进Python编程的世界,无论你是初学者还是有一定基础的开发者,都能从中受益。我们将从最基础的语法开始讲解,逐步深入到更复杂的主题,如数据结构、面向对象编程和网络编程等。通过本文的学习,你将能够编写出自己的Python程序,实现各种功能。让我们一起踏上Python编程之旅吧!
|
4天前
|
数据采集 机器学习/深度学习 人工智能
Python编程入门:从基础到实战
【10月更文挑战第36天】本文将带你走进Python的世界,从基础语法出发,逐步深入到实际项目应用。我们将一起探索Python的简洁与强大,通过实例学习如何运用Python解决问题。无论你是编程新手还是希望扩展技能的老手,这篇文章都将为你提供有价值的指导和灵感。让我们一起开启Python编程之旅,用代码书写想法,创造可能。
|
5天前
|
Python
不容错过!Python中图的精妙表示与高效遍历策略,提升你的编程艺术感
本文介绍了Python中图的表示方法及遍历策略。图可通过邻接表或邻接矩阵表示,前者节省空间适合稀疏图,后者便于检查连接但占用更多空间。文章详细展示了邻接表和邻接矩阵的实现,并讲解了深度优先搜索(DFS)和广度优先搜索(BFS)的遍历方法,帮助读者掌握图的基本操作和应用技巧。
21 4
|
5天前
|
设计模式 程序员 数据处理
编程之旅:探索Python中的装饰器
【10月更文挑战第34天】在编程的海洋中,Python这艘航船以其简洁优雅著称。其中,装饰器作为一项高级特性,如同船上的风帆,让代码更加灵活和强大。本文将带你领略装饰器的奥秘,从基础概念到实际应用,一起感受编程之美。
|
8天前
|
存储 人工智能 数据挖掘
从零起步,揭秘Python编程如何带你从新手村迈向高手殿堂
【10月更文挑战第32天】Python,诞生于1991年的高级编程语言,以其简洁明了的语法成为众多程序员的入门首选。从基础的变量类型、控制流到列表、字典等数据结构,再到函数定义与调用及面向对象编程,Python提供了丰富的功能和强大的库支持,适用于Web开发、数据分析、人工智能等多个领域。学习Python不仅是掌握一门语言,更是加入一个充满活力的技术社区,开启探索未知世界的旅程。
16 5