码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Python垃圾回收机制详解:引用计数与循环垃圾收集器


    文章目录

    • Python垃圾回收机制
      • 引用计数机制
      • 循环垃圾收集器
      • 小结
      • 详细讲解及实操
        • 1. 程序中的垃圾问题
        • 2. 垃圾的定义
        • 3. 自动垃圾回收机制
        • 4. 示例:使用del方法删除垃圾对象
        • 5. 手动处理垃圾回收
        • 6. 结束程序
        • 7. 垃圾回收的自动处理
        • 8. 结束程序
    • python精品专栏推荐
      • python基础知识(0基础入门)
      • python爬虫知识

    Python垃圾回收机制

    Python编程语言采用了自动垃圾回收机制,它能够自动释放不再需要的对象,并将其占用的内存返回给操作系统,供其他程序使用。这在一定程度上减轻了程序员的负担,因为他们无需手动释放内存。

    引用计数机制

    Python主要使用引用计数作为垃圾回收机制的一部分。每个对象都有一个引用计数器,用于记录有多少个变量引用了该对象。当引用计数器归零时,表示没有变量引用该对象,该对象就成为垃圾对象,会被垃圾回收机制自动删除。

    下面是一个简单的示例来演示引用计数机制的工作原理:

    class Person:
        def __init__(self, name):
            self.name = name
    
        def __del__(self):
            print(f'{self.name}对象被删除了')
    
    # 创建两个对象,并相互引用
    p1 = Person('Alice')
    p2 = Person('Bob')
    
    # 打印两个对象的引用计数器
    print(sys.getrefcount(p1))  # 输出结果为2,包括p1和参数传递中的临时引用
    print(sys.getrefcount(p2))  # 输出结果为2
    
    # 断开对象之间的相互引用
    p1 = None
    p2 = None
    
    # 观察析构函数的调用情况
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在上面的示例中,我们定义了一个Person类,创建了两个对象p1和p2,并相互引用。使用sys.getrefcount()函数可以获取对象的引用计数。最后,我们将p1和p2的引用置为None,断开了它们之间的相互引用。这时,可以观察到__del__方法被调用,打印出对象被删除的消息。

    循环垃圾收集器

    除了引用计数机制,Python还使用循环垃圾收集器(Cycle GC)处理循环引用。循环引用指的是两个或多个对象相互引用,而没有其他对象引用它们,导致无法访问这些对象。循环垃圾收集器会定期扫描内存中的对象,检测循环引用并清理掉这些无法访问的对象。

    以下是循环引用的示例:

    class A:
        def __init__(self, b):
            self.b = b
    
    class B:
        def __init__(self, a):
            self.a = a
    
    # 创建两个对象,并相互引用形成循环引用
    a_obj = A(None)
    b_obj = B(a_obj)
    a_obj.b = b_obj
    
    # 对象无法通过其他引用访问到
    a_obj = None
    b_obj = None
    
    # 手动进行垃圾回收
    gc.collect()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这个示例中,我们创建了两个对象a_obj和b_obj,它们相互引用形成循环引用。即使将它们的引用置为None,这些对象也无法通过其他引用访问到。手动调用gc.collect()可以强制执行垃圾回收,清理掉这些无法访问的对象。

    需要注意的是,大多数情况下,不需要手动进行垃圾回收操作。Python的垃圾回收机制会在适当的时候自动执行。手动调用垃圾回收通常是在某些特殊情况下使用,例如在大量创建和销毁对象的情况下,以优化内存使用。

    通过了解Python的垃圾回收机制,程序员可以更好地管理内存,提高代码的效率和可维护性。

    小结

    当对象之间存在循环引用时,Python的循环垃圾收集器会起作用。循环垃圾收集器使用了另一种策略,称为"标记-清除"。下面是循环垃圾收集器的工作过程:

    1. 标记阶段:从根对象开始,循环垃圾收集器遍历所有可达的对象,并将其标记为"存活"。
    2. 清除阶段:循环垃圾收集器扫描堆内存中的所有对象,将未标记的对象判定为垃圾对象,回收它们的内存空间。

    循环垃圾收集器执行的时机由Python解释器自动控制。当达到一定条件时,例如内存占用超过阈值、CPU空闲时等,Python解释器会触发循环垃圾收集器的执行。

    需要注意的是,循环垃圾收集器的工作会导致一定的性能开销。因此,在编写代码时,我们应尽量避免出现循环引用的情况,以减少垃圾回收的频率和开销。

    此外,Python还提供了gc模块,允许我们对垃圾回收进行更精细的控制。通过调整gc模块的相关参数,我们可以改变垃圾回收的行为,例如禁用循环垃圾收集器、设置垃圾回收的阈值等。具体使用方法可以参考Python官方文档。

    总结起来,Python的垃圾回收机制主要包括引用计数和循环垃圾收集器。引用计数用于跟踪对象的引用情况,当没有变量引用该对象时,对象会被释放。循环垃圾收集器则处理存在循环引用的情况,标记并清除无法访问的对象。通过这两种机制,Python能够自动管理内存并进行垃圾回收,减轻了程序员的负担。

    详细讲解及实操

    1. 程序中的垃圾问题

    程序运行过程中会产生垃圾,而这些垃圾会影响程序的性能。因此,我们需要及时清理这些垃圾。

    2. 垃圾的定义

    在程序中,没有被引用的对象被认为是垃圾。当垃圾对象过多时,会影响程序的性能。

    3. 自动垃圾回收机制

    在Python中,有自动的垃圾回收机制。它会自动删除那些没有被引用的对象,无需手动处理垃圾回收。

    4. 示例:使用del方法删除垃圾对象

    以下是一个示例代码,展示了如何使用del方法删除垃圾对象。

    class A:
        def __init__(self):
            self.name = 'A类'
    
        # del是一个特殊方法,它会在对象被垃圾回收前调用
        def __del__(self):
            print('A()对象被删除了~~~',self)
    
    a = A()
    b = a # 又使用一个变量b,来引用a对应的对象
    
    print(a.name)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    5. 手动处理垃圾回收

    如果希望手动处理垃圾回收,可以将对象的引用置为None,或使用del语句删除引用。下面是示例代码:

    # 将a设置为了None,此时没有任何的变量对A()对象进行引用,它就是变成了垃圾
    a = None
    b = None
    
    • 1
    • 2
    • 3

    6. 结束程序

    最后,在代码的末尾可以加一行输入语句,以便程序执行完成后等待用户输入退出。

    input('回车键退出...')
    
    • 1

    7. 垃圾回收的自动处理

    Python的垃圾回收机制会自动删除那些没有被引用的对象,无需手动处理。以下是示例代码:

    # 定义一个类A
    class A:
        def __init__(self):
            self.name = 'A类'
    
        # del是一个特殊方法,它会在对象被垃圾回收前调用
        def __del__(self):
            print('A()对象被删除了~~~',self)
    
    # 创建一个A类的实例a并引用它
    a = A()
    
    # 打印a的名称属性值
    print(a.name)
    
    # 删除a的引用
    a = None
    
    # 程序运行结束后,会自动调用垃圾回收机制删除没有被引用的对象
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    当程序运行结束时,Python会自动调用垃圾回收机制来删除没有被引用的对象。你可以看到,在示例代码中,当a的引用被设置为None时,对象a就成为了垃圾对象,最终会被垃圾回收机制删除。

    8. 结束程序

    最后,在代码的末尾可以加一行输入语句,以便程序执行完成后等待用户输入退出。

    input('回车键退出...')
    
    • 1

    python精品专栏推荐


    python基础知识(0基础入门)

    【python基础知识】0.print()函数
    【python基础知识】1.数据类型、数据应用、数据转换
    【python基础知识】2.if条件判断与条件嵌套
    【python基础知识】3.input()函数
    【python基础知识】4.列表和字典
    【python基础知识】5.for循环和while循环
    【python基础知识】6.布尔值和四种语句(break、continue、pass、else)
    【python基础知识】7.实操-用Python实现“文字PK”小游戏(一)
    【python基础知识】7.实操-用Python实现“文字PK”小游戏(二)
    【python基础知识】8.编程思维:如何解决问题-思维篇
    【python基础知识】9.函数的定义和调用
    【python基础知识】10.用函数编写程序 - 实操篇
    【python基础知识】10.用Python实现石头剪刀布小游戏-函数实操篇
    【python基础知识】11.如何debug -常见报错原因及排查思路 - 思维篇
    【python基础知识】12.类与对象(一)
    【python基础知识】12.类与对象(二)
    【python基础知识】13.类与对象(三)
    【python基础知识】13.类与对象(四)
    【python基础知识】14.图书管理系统的搭建(类与对象实操)
    【python基础知识】15.编码基础知识
    【python基础知识】16.文件读写基础及操作
    【python基础知识】16.“古诗默写题”的python实现(文件读写和编码-实操篇)
    【python基础知识】17.模块的概念以及如何引入
    【python基础知识】18.实操-使用python自动群发邮件
    【python基础知识】19.产品思维以及流程图的使用 - 思维篇
    【python基础知识】20.“午饭吃什么”的python实现(产品思维-实操篇)
    【python基础知识】21.高效偷懒的正确打开方式-毕业篇
    【python文件处理】CSV文件的读取、处理、写入
    【python文件处理】Excel自动处理(使用 openpyxl)
    【python文件处理】-excel格式处理


    python爬虫知识

    【python爬虫】1.爬虫基础知识
    【python爬虫】2.网页基础知识
    【python爬虫】3.爬虫初体验(BeautifulSoup解析)
    【python爬虫】4.爬虫实操(菜品爬取)
    【python爬虫】5.爬虫实操(歌词爬取)
    【python爬虫】6.爬虫实操(带参数请求数据)
    【python爬虫】7.爬到的数据存到哪里?
    【python爬虫】8.温故而知新
    【python爬虫】9.带着小饼干登录(cookies)
    【python爬虫】10.指挥浏览器自动工作(selenium)
    【python爬虫】11.让爬虫按时向你汇报
    【python爬虫】12.建立你的爬虫大军
    【python爬虫】13.吃什么不会胖(爬虫实操练习)
    【python爬虫】14.Scrapy框架讲解
    【python爬虫】15.Scrapy框架实战(热门职位爬取)
    【python爬虫】16.爬虫知识点总结复习

  • 相关阅读:
    积分商城商品供应商选择的三个要求
    【EI会议征稿】第二届纯数学、应用数学与计算数学国际学术会议(PACM 2024)
    递归思想
    SQL Injection
    母婴小程序定制开发
    第6章 Kafka面试题
    ROS OpenCV 级联分类器
    Java中使用CountDownLatch实现并发流程控制
    【Linux】动静态库的使用与软链接的结合
    电子抄表是什么?什么叫电子抄表?
  • 原文地址:https://blog.csdn.net/qq_41308872/article/details/132856848
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号