详解Python3的垃圾回收机制

Python的垃圾回收机制主要包括两个部分:引用计数和循环引用检测。

引用计数法

内部采用 引用计数法,为每个对象维护引用次数,并据此回收不在需要的垃圾对象。

由于引用计数法存在重大缺陷,循环引用时由内存泄露风险,因此Python还采用 标记清除法 来回收在循环引用的垃圾对象,循环引用检测。

此外,为了提高垃圾回收(GC)效率,Python还引入了 分代回收机制

循环引用检测

引用计数主要处理的是基本数据类型和简单的数据结构,如列表和字典等。然而,如果两个对象互相引用,即使它们被其他任何对象所引用,引用计数也不会减少到0,因为它们互相保持了对方的引用计数。为了处理这种情况,Python引入了一个循环检测器,该检测器通过定期执行一个循环垃圾回收的算法,找出并清除引用计数无法归零的对象。

循环检测器包括两个主要部分:一个是用于寻找所有可疑的循环引用的分代垃圾回收机制,另一个是用于确实并清除引用计数无法归零的对象的循环垃圾回收机制。

这两种机制一起工作,可以有效地回收Python中不再使用的对象,从而防止内存泄漏。

请注意,虽然这些是Python的默认垃圾回收机制,但是也可以通过Python的gc模块显式地控制垃圾回收的行为。

引用计数增加

  • 对象被创建
  • 如果有新的对象使用该对象
  • 作为容器对象的一个元素
  • 被作为参数传递给函数

引用计数减少

  • 对象的引用被显示的销毁
  • 新对象不在使用该对象
  • 对象从列表中被移除,或者列表对象本身被销毁
  • 函数调用结束

引用机制优点

  • 简单
  • 实时性:一旦没有引用,内存就直接释放了。

引用机制缺点

  • 维护引用计数消耗资源
  • 循环引用的问题无法解决

a = [1,2]
b = [3,4]
a.append(b) #b的计数器2
b.append(a) #a的计数器2
del a
del b

标记-清除法

1. 对比引用计数法

       引用计数法能够解决大多数垃圾回收的问题,但是遇到两个对象相互引用的情况,del语句可以减少引用次数,但是引用计数不会归0,对象也就不会被销毁,从而造成了内存泄漏问题。针对该情况,Python引入了标记-清除机制

2. 循环引用

        引用计数这种管理内存的方式虽然很简单,但是有一个比较大的瑕疵,即它不能很好的解决循环引用问题。如上图所示:对象 A 和对象 B,相互引用了对方作为自己的成员变量,只有当自己销毁时,才会将成员变量的引用计数减 1。因为对象 A 的销毁依赖于对象 B销毁,而对象 B 的销毁与依赖于对象 A 的销毁,这样就造成了我们称之为循环引用(Reference Cycle)的问题,这两个对象即使在外界已经没有任何指 针能够访问到它们了,它们也无法被释放。

        遍历活跃对象,第一步需要找出 根对象 ( root object )集合。所谓根对象,就是指被全局引用或者在栈中引用的对象,这部分对象是不能被删除的。因此,我们将这部分对象标记为绿色,作为活跃对象遍历的起点。

        根对象本身是 可达的 ( reachable ),不能删除;被根对象引用的对象也是可达的,同样不能删除;以此类推。我们从一个根对象出发,沿着引用关系遍历,遍历到的所有对象都是可达的,不能删除。而没有被标色的对象就是 不可达 ( unreachable )的垃圾对象,可以被安全回收。循环引用的致命缺陷完美解决了!

分代回收机制

    Python将内存根据对象的存活时间划分为不同的集合,每个集合称为一个代,Python将内存分为了3“代”,分别为年轻代(第0代)中年代(第1代)老年代(第2代),对应的是3个链表,它们的垃圾收集频率随着对象的存活时间的增大而减小。

Python的垃圾回收机制不会保证立即释放内存,可能会在程序运行过程中或程序结束后执行。因此,虽然Python的垃圾回收机制可以帮助优化内存使用,减少内存泄漏和不必要的内存分配,但是开发者仍然需要注意编写高效的代码,避免不必要的内存消耗。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/670353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自动驾驶TPM技术杂谈 ———— Unix常用命令行

文章目录 介绍常用命令 —— A常用命令 —— C常用命令 —— D常用命令 —— E常用命令 —— F常用命令 —— G常用命令 —— H常用命令 —— I常用命令 —— J常用命令 —— K常用命令 —— L常用命令 —— M常用命令 —— N常用命令 —— P常用命令 —— Q常用命令 —— R常用…

Vue3——创建一个应用

文章目录 创建应用实例挂载应用没有模板的组件的挂载 应用配置多个应用实例 其实使用脚手架创建的vue项目的main.js文件中已经为我们配置好 vue应用的创建。 import { createApp } from vue import App from ./App.vue const app createApp(App) app.mount(#app)创建应用实例…

C++ JSON解析

JSON解析 JSONCPPC实现JSON解析器 JSONCPP JSONCPP源码链接:https://github.com/open-source-parsers/jsoncpp JSOCPP源码下载以后,首先复制一份include文件夹下的json文件夹,头文件留着后续备用。 使用Cmake生成项目。在IDE中编译jsoncpp_…

【Nicn的刷题日常】之打印整数二进制的奇数位和偶数位

目录 1.题目描述 2.解题思路 3.解题 1.题目描述 获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列 2.解题思路 1. 提取所有的奇数位,如果该位是1,输出1,是0则输出0 2. 以同样的方式提取偶数位置检测n…

CGAL-3D 凸包算法

3D 凸包算法 一、概述二、静态凸包构造1. Traits 特征类2. 极端点3. 半空间相交4. 凸性检验 三、动态凸包构造四、性能 一、概述 一个点集 S∈R3 是凸的,如果对于任意两点 p 和 q 在集合中,具有端点的线段 p 和 q 包含在 S。集合的凸包 P 包含点集 S 的最…

GADM 4.1 全球国家行政区划下载

扫描文末二维码,关注微信公众号:ThsPool 后台回复g004,领取最新 GADM 4.1 全球国家行政区划 GADM概述 GADM,全称 Database of Global Administrative Areas,是一个开放获取的全球行政区划数据库,包含各国、…

APIfox编排自动化测试场景(一)

测试场景用于将多个接口请求与实际可能发生的一些特殊情况(如条件判断、循环)有序的组合在一起,来模拟一个真实业务流程,组成自动化测试单元。 新建目录 / 测试场景​ 打开 Apifox 后点击左侧菜单栏中的“自动化测试”&#xff…

基于Vue的移动端UI框架整理

一、Vant 官方地址:https://youzan.github.io/vant/#/zh-CN/ 简介:有赞公司开发。 特性:60 高质量组件、90% 单元测试覆盖率、完善的中英文文档和示例、支持按需引入、支持主题定制、支持国际化、支持 TS、支持 SSR。 特别说明&#xff1…

机器学习---概率图模型(隐马尔可夫模型、马尔可夫随机场、条件随机场)

1. 隐马尔可夫模型 机器学习最重要的任务是根据已观察到的证据(例如训练样本)对感兴趣的未知变量(例如类别标 记)进行估计和推测。概率模型(probabilistic model)提供了一种描述框架,将描述任…

MySQL单主模式部署组复制集群

前言 本篇文章介绍MySQL8.0.27版本的组复制详细搭建过程,教你如何快速搭建一个三节点的单主模式组复制集群。 实际上,MySQL组复制是MySQL的一个插件 group_replication.so,组中的每个成员都需要配置并安装该插件,配置和安装过程…

R语言阈值效应函数cut.tab2.0版发布(支持线性回归、逻辑回归、cox回归,自定义拐点)

阈值效应和饱和效应是剂量-反应关系中常见的两种现象。阈值效应是指当某种物质的剂量达到一定高度时,才会对生物体产生影响,而低于这个剂量则不会产生影响。饱和效应是指当某种物质的剂量达到一定高度后,其影响不再随剂量的增加而增加&#x…

编译DuiLib库遇到的变量定义位置问题

C89 规定,所有局部变量都必须定义在函数开头,在定义好变量之前不能有其他的执行语句; C99 标准取消这这条限制,但是 VC/VS 对 C99 的支持不是很积极; C99 是 C89 的升级版; 如图是修改之后的代码&#xff1…

腾讯音乐面试题

Docker相关 Docker 是一个开源的应用容器平台,它允许开发者构建、打包、分发和运行任何应用——从简单的命令行工具到复杂的微服务架构。Docker 的核心概念主要包括: 容器 (Containers): Docker 容器是轻量级的、可执行的独立软件包,包含应用…

AI专题:海外科技巨头指引,AI主线逻辑依旧坚挺

今天分享的是AI 系列深度研究报告:《AI专题:海外科技巨头指引,AI主线逻辑依旧坚挺》。 (报告出品方:华西证券) 报告共计:54页 本周热点:海外科技巨头指引,AI主线逻辑依旧坚挺 硬件…

介绍docker

一:介绍docker: Docker 并没有单独的图形界面,它主要通过命令行来进行管理和操作 1、 docker ps:显示正在运行的容器。 docker images:显示本地的镜像。 docker run:创建并启动一个新容器。 docker stop&a…

Redis面试题42

人工智能对工作岗位和就业市场会有什么影响? 答:人工智能对工作岗位和就业市场将带来深远的影响。虽然一些工作可能会被自动化取代,但同时也将出现新的工作机会。以下是人工智能对工作岗位和就业市场的一些影响: 自动化工作&…

6. 尚硅谷大数据111门技术+42个项目

文章目录 第 1 章尚硅谷大数据全套技术第 2 章尚硅谷大数据全套项目 资料来源于网络,仅用于个人学习。 仅用于个人搜索使用。 第 1 章尚硅谷大数据全套技术 1.Java从入门到精通JDK版 链接:https://pan.baidu.com/s/1GAc610SYSMmZBuOX4DJ-lg 提取码&…

C++ //练习 4.17 说明前置递增运算符和后置递增运算符的区别。

C Primer(第5版) 练习 4.17 练习 4.17 说明前置递增运算符和后置递增运算符的区别。 环境:Linux Ubuntu(云服务器) 工具:vim 解释 前置递增运算符先对对象进行递增,然后取递增后的值赋值给左…

使用Dubbo实现微服务之间的高效通信

目录 一、RPC与Dubbo 二、Springboot整合Dubbo 服务端实现 消费端实现 一、RPC与Dubbo RPC(Remote Procedure Call)是指远程过程调用。 常见的RPC框架有Dubbo(Alibaba )、gRPC(Google)、Thrift&#…

Linux查看系统与资源

1、查看操作系统 # 查看操作系统版本: cat /etc/redhat-release2、查看CPU、内存 # 总核数 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 物理CPU个数 X 每颗物理CPU的核数 X 超线程数# 查看物理CPU的个数 cat /proc/cpuinfo | grep "physical id&…