CPython 中垃圾回收的主要思路

1.维护引用计数器 。对于每一个对象,都有一个对于该对象的引用次数的计数器。如果这个计数器的值减为了 0 ,这就代表这个对象在程序中已经没用了,那么该对象所占用的内存就会被释放。

2.定期检测是否循环引用。 当引用计数器的值下降到 0 时来释放内存的机制并不适用于所有的情况。假如两个对象 A 和 B ,其中 A 拥有对 B 的引用,B 拥有对 A 的引用。 这就称之为循环引用。在这种情况下,这两个对象也没有存在的价值了,此时 A 和 B 都应该被垃圾回收处理。但是,这两个对象的引用计数值不为零, 所以内存会一直被占用。为了解决这个问题,CPython 通过使用算法来检测是否存在循环引用并释放循环引用中的对象。

3.通过启发式算法提升性能。 越晚创建的对象更可能需要被回收。 CPython 引入了一个 分代回收 的概念来判断一个对象使用的相对年龄。年轻一代是指最新被创建出来的对象,而老一代则代表早前创建的对象。每个对象都确定的属于某一代。 当垃圾回收机制执行时, CPython 会优先尝试回收年轻一代的对象。CPython 会定期回收老一代的对象 (由启发式算法确定该回收执行的效率).

垃圾回收循环

了解 CPython 垃圾回收的运作周期是非常有益的。我们创建一个对象来观察垃圾回收机制的运作:

Python 需要配置一个新的对象。为此,它调用 _PyObject_GC_Malloc,给这个对象分配内存以及将其添加到垃圾回收的第一阶段(我们称为 0 代)。 随即查看这个对象在 0 代中的数值是否超过阈值。如果确实超过阈值,而且垃圾回收机制当前没有运作,对 collect_generations 的调用随机生效进行垃圾回收。否则对象正常分配内存。

当 collect_generations 被调用,Python 开始垃圾回收。这个方法算出什么阶段进行垃圾回收 (CPython 默认有三代,但 GC 模块可以修改.。此外,年轻一代拥有低级索引,所以 0 代是最年轻的一代)。Python 循环所有代 (从最老到最年轻) 然后检测某一代的对象值超过阈值。如果有,它会将所有年轻代合并到 这一代然后调用 collect 对这一代进行垃圾回收 。注意: Python 希望最好在 0 代进行垃圾回收, 因为这一代拥有最年轻的对象,同样也能迭代最少。对老一代进行垃圾回收相当于收集所有对象因为对第 i 代的垃圾回收会使用从 0 到 i 代的所有对象。

collect 会对特定代进行垃圾回收。这相当于运行参考循环检测算法 (待会介绍) 然后在特定代找出一系列可得到和不可得到的对象。 这些可得到的对象会被并入下一高级的代 (也就是说,如果 collect 在第 i 代运行,第 i 代的对象会被合并到 i+1 代)。对于不可获得的对象, CPython 会进行所有可能的终结器回调,使弱 ref 回调,最终解除这些对象分配。

最后,垃圾回收模块的内部状态会更新为 collect 完成它的职责。

python 垃圾回收哪时候执行_Python 中的垃圾回收机制是如何工作的?相关推荐

  1. Python基础_第3章_Python中的循环结构

    Python基础_第3章_Python中的循环结构 文章目录 Python基础_第3章_Python中的循环结构 Python中的循环结构 一.回顾分支练习题 1.判断是否为一个合法三角形 2.求世界 ...

  2. Python基础_第5章_Python中的数据序列

    Python基础_第5章_Python中的数据序列 文章目录 Python基础_第5章_Python中的数据序列 Python中的数据序列 一.字典--Python中的==查询==神器 1.为什么需要 ...

  3. python有向图_Python 中的垃圾回收机制

    一.概述 python采用的是引用计数机制为主,标记-清除和分代收集(隔代回收)两种机制为辅的策略. 现在的高级语言如java,c#等,都采用了垃圾收集机制,而不再是c,c++里用户自己管理维护内存的 ...

  4. 简述python垃圾回收机制_python中的垃圾回收机制简述

    2020年12月5日21:47:35 王凯玉 python中的垃圾回收机制 引用计数 # 引用计数 引用计数是编程语言中的一中内存管理技术,可以将资源的被引用次数保存起来. 当引用计数为0时,资源将被 ...

  5. python怎么清理垃圾_Python 中的“垃圾”是怎么回收的?

    前言 对于python来说,一切皆为对象,所有的变量赋值都遵循着对象引用机制.程序在运行的时候,需要在内存中开辟出一块空间,用于存放运行时产生的临时变量:计算完成后,再将结果输出到永久性存储器中.如果 ...

  6. python gc教程_python中的垃圾回收(GC)机制

    一.引用计数 Python 垃圾回收以引用计数为主,分代回收为辅.引用计数法的原理是每个对象维护一个ob_refcnt,用来记录对象被引用的次数,也就是用来追踪有多少个引用指向了对象,当发生以下四种情 ...

  7. python 类可以调用实例变量_python中的实例方法、静态方法、类方法、类变量和实例变量浅析...

    注:使用的是Python2.7. 一.实例方法 实例方法就是类的实例能够使用的方法.如下: class Foo: def __init__(self, name): self.name = name ...

  8. python语句x 3 3执行_Python 3.x 学习笔记--杂

    在交互式环境中,编译器会有一个小整数池的概念,会把(-5,256)间的数预先创建好,而当a和b超过这个范围的时候,两个变量就会指向不同的对象了,因此地址也会不一样, http://www.runoob ...

  9. python僵尸进程和孤儿进程_python中多进程应用及僵尸进程、孤儿进程

    一.python如何使用多进程 创建子进程的方式 1.导入multiprocessing 中的Process类 实例化这个类 指定要执行的任务 target import os from multip ...

最新文章

  1. python语法syntaxerror怎么修改-Python 语法错误
  2. 【开发环境】PyCharm 打开现有 Python 工程 ( 配置 Python 编译器版本 )
  3. 正式软件工作第一天————MVC、ext JS、和clsa
  4. android 监听布局改变,Android通过监听最外层布局的改变监听键盘的状态,软键盘的弹出和收起都会改变外层布局(前提是把Activity的mode设置成压缩);...
  5. 【学习记录】网络层——IP数据报(格式与分片)
  6. 产品经理有话说!这个报表神器更新了6大功能,绝对亮眼
  7. 接口测试之抓包工具fidder
  8. 数字形式转换,输入0123456789对应输出“一二三四五六七八九”
  9. Navicat Premium 注册码与破解
  10. 3D旋转相册html+css代码分享
  11. android删除字符,【已解决】Android中EditText中退格键BackSpace键(删除键)不起效果:无法删除字符...
  12. OpenCV图形处理基本概念
  13. 国防科技大学计算机作品赛,信息学院教师在全国计算机类课程实验教学案例设计竞赛中获一等奖...
  14. 扬帆际海:shopee店铺关键词广告怎么获得流量?
  15. RK3399 GMAC驱动失败,打印如下log,DMA engine initialization failed 原因
  16. 【翻译】Xv6 book Chapter 8:File system
  17. 10 个超好用的免费开源项目管理软件
  18. 企业官网小程序搭建教程
  19. mpu和嵌入式linux区别,嵌入式MCU与MPU的区分和MCU开发中的三个误区
  20. 桌面应用程序 架构_关于该架构的全部内容:探索不同的架构模式以及如何在您的应用程序中使用它们

热门文章

  1. 为什么转换不了html,特殊字符不会转换为html实体(html_entity_decode不工作)
  2. C语言状态机编程思想
  3. mysql周报内容范文_Mysql各种表格查询含实例,日报,周报,月报,时间差自动计算...
  4. android高德地图自定义带数字marker图标,自定义图标-点标记-示例中心-JS API 示例 | 高德地图API...
  5. 双向链表操作c语言 函数,c语言 双向链表的基础操作
  6. java负数转换二进制表示_Java中的负数的在计算机中的二进制表示,以及与十进制的相互转换...
  7. 西门子上升沿指令_西门子SCL编程实例——霓虹灯顺序控制(DECO指令)
  8. 多线程之继承Thread类及多线程内存分析
  9. 大数据 -- kafka学习笔记:知识点整理(部分转载)
  10. c#中引用类型作为值参数和引用参数问题