python垃圾回收机制为什么标记能解决循环引用问题_Python 垃圾回收机制和如何解决循环引用...

引用计数:是一种垃圾收集机制,而且也是一种最直观,最简单的垃圾收集技术, 当一个对象的引用被创建或者复制时,对象的引用计数加 1;当一个对象的引用被销毁时,对象的引用计数减 1;当对象的引用计数减少为 0 时,就意味着对象已经没有被任何人使用了,可以将其所占用的内存释放了。虽然引用计数必须在每次分配和释放内存的时候加入管理引用计数的动作,然而与其他主流的垃圾收集技术相比,引用计数有一个最大的有点,即“实时性”,任何内存,一旦没有指向它的引用,就会立即被回收。而其他的垃圾收集计数必须在某种特殊条件下(比如内存分配失败)才能进行无效内存的回收。

引用计数机制执行效率问题:引用计数机制所带来的维护引用计数的额外操作与 Python 运行中所 进行的内存分配和释放,用赋值的次数是成正比的。而这点相比其他主流的垃圾回收机制,比如“标 记-清除”,“停止-复制”,是一个弱点,因为这些技术所来的额外操作基本上只是与待回收的内存 数量有关。

如果说执行效率还仅仅是引用计数机制的一个软肋的话,那么很不幸,引用计数机制还存在着一个 致命的弱点,正是由于这个弱点,使得侠义的垃圾收集从来没有将引用计数包含在内,能引发出这个致 命的弱点就是循环引用(也称交叉引用)。

问题说明: 循环引用可以使一组对象的引用计数不为 0,然而这些对象实际上并没有被任何外部对象所引用, 它们之间只相互引用。这意味着不会再有人使用这组对象,应该回收这组对象所占用的内存空间,然 后由于相互引用的存在,每一个对象的用计数都不为 0,因此这些对象所占用的内存永远不会被释放。 比如:这一点是致命的,这与手动进行内存管理所产生的内存泄露毫无区别。

要解决这个问题,Python 引入了其他的垃圾收集机制来弥补引用计数的缺陷:“标记-清除”,“分 代回收”两种收集技术。

标记-清除:标记-清除”是为了解决循环引用的问题。可以包含其他对象引用的容器对象(比如:list, set,dict,class,instance)都可能产生循环引用。

我们必须承认一个事实,如果两个对象的引用计数都为 1,但是仅仅存在他们之间的循环引用,那 么这两个对象都是需要被回收的,也就是说,它们的引用计数虽然表现为非 0,但实际上有效的引用计 数为 0。我们必须先将循环引用摘掉,那么这两个对象的有效计数就现身了。假设两个对象为 A、B, 我们从 A 出发,因为它有一个对 B 的引用,则将 B 的引用计数减 1;然后顺着引用达到 B,因为 B 有一 个对 A 的引用,同样将 A 的引用减 1,这样,就完成了循环引用对象间环摘除。

但是这样就有一个问题,假设对象 A 有一个对象引用 C,而 C 没有引用 A,如果将 C 计数引用减 1, 而最后 A 并没有被回收,显然,我们错误的将 C 的引用计数减 1,这将导致在未来的某个时刻出现一个 对 C 的悬空引用。这就要求我们必须在 A 没有被删除的情况下复原 C 的引用计数,如果采用这样的方 案,那么维护引用计数的复杂度将成倍增加。

原理:“标记-清除”采用了更好的做法,我们并不改动真实的引用计数,而是将集合中对象的引用 计数复制一份副本,改动该对象引用的副本。对于副本做任何的改动,都不会影响到对象生命走起的维 护。

这个计数副本的唯一作用是寻找 root object 集合(该集合中的对象是不能被回收的)。当成功寻 找到 root object 集合之后,首先将现在的内存链表一分为二,一条链表中维护 root object 集合,成 为 root 链表,而另外一条链表中维护剩下的对象,成为 unreachable 链表。之所以要剖成两个链表, 是基于这样的一种考虑:现在的 unreachable 可能存在被 root 链表中的对象,直接或间接引用的对象, 这些对象是不能被回收的,一旦在标记的过程中,发现这样的对象,就将其从 unreachable 链表中移到 root 链表中;当完成标记后,unreachable 链表中剩下的所有对象就是名副其实的垃圾对象了,接下 来的垃圾回收只需限制在 unreachable 链表中即可。

分代回收 背景:分代的垃圾收集技术是在上个世纪 80 年代初发展起来的一种垃圾收集机制,一系 列的研究表明:无论使用何种语言开发,无论开发的是何种类型,何种规模的程序,都存在这样一点相 同之处。即:一定比例的内存块的生存周期都比较短,通常是几百万条机器指令的时间,而剩下的内存 块,起生存周期比较长,甚至会从程序开始一直持续到程序结束。

从前面“标记-清除”这样的垃圾收集机制来看,这种垃圾收集机制所带来的额外操作实际上与系统 中总的内存块的数量是相关的,当需要回收的内存块越多时,垃圾检测带来的额外操作就越多,而垃圾 回收带来的额外操作就越少;反之,当需回收的内存块越少时,垃圾检测就将比垃圾回收带来更少的额 外操作。为了提高垃圾收集的效率,采用“空间换时间的策略”。

原理:将系统中的所有内存块根据其存活时间划分为不同的集合,每一个集合就成为一个“代”, 垃圾收集的频率随着“代”的存活时间的增大而减小。也就是说,活得越长的对象,就越不可能是垃圾, 就应该减少对它的垃圾收集频率。那么如何来衡量这个存活时间:通常是利用几次垃圾收集动作来衡量, 如果一个对象经过的垃圾收集次数越多,可以得出:该对象存活时间就越长。

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

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

相关文章

Dapr + .NET 实战(十-终篇)K8S运行Dapr

工作原理为了实现在k8s上安装Dapr,Dapr需要部署dapr-sidecar-injector、dapr-operator、dapr-placement和dapr-sentry服务。 dapr-operator: 管理组件(state stores, pub/subs, etc.)dapr-sidecar-injector: 将 Dapr 注入 annotated pods,并添加环境变量…

mvc control 请求两次问题

今天在做项目时&#xff0c;突然发现一个mvc 的control中action被执行了两次&#xff0c;最终发现是由于favicon.ico导致的。问题代码&#xff1a; <link rel"shortcut icon" href"Images/wangyi.ico" type"image/x-icon" />,最终改成了 &…

双系统卸载

xp卸载vista 1,xp我的电脑右键&#xff0c;属性&#xff0c;磁盘管理。 2&#xff0c;右击vista磁盘&#xff0c;格式化&#xff0c;设在格式化选项&#xff0c;确定。 3&#xff0c;在运行了输入msconfig,确定。 4&#xff0c;在系统配置实用程序对话框中切换到boot.ini选项卡…

为什么老师批改完试卷,分数下要画两条横线?今天终于知道了!

全世界只有3.14 % 的人关注了爆炸吧知识总有考试分数下画两条横线的习惯&#xff0c;原来是这样形成的&#xff01;为什么老师改卷之后会在分数下画两条横线呢&#xff1f;你要去问老师&#xff1f;别问了&#xff0c;可能连老师都不知道……来看看这位当了老师的网友怎么说的&…

mysql数据库已连接数据库_001. 【已解决】Java连接MYSQL 数据库的连接步骤

这篇文章主要以MySQL为例讲下Java如何连接到数据库的。当然&#xff0c;首先要安装有JDK(一般是JDK1.5.X)。然后安装MySQL&#xff0c;这些都比较简单&#xff0c;具体过程就不说了。配置好这两个环境后&#xff0c;下载JDBC驱动mysql-connector-java-5.0.5.zip(这个是最新版的…

Windows 11 小技巧- WSL开启Linux桌面应用

WSL 经过⼏年的发展&#xff0c;已经是⼀个Windows下不少开发⼈员做云原⽣应⽤的必备环境&#xff0c;你可以在上⾯写各种语⾔&#xff0c;各种后端框架&#xff0c;也可以完成容器和k8s的部署&#xff0c;在Windows11下更进⼀步&#xff0c;直接⽀持Linux桌⾯应⽤&#xff0c;…

lcd屏幕抖动_电视屏幕面板大科普!买电视之前必看!

BOE知识酷 ?显示技术|显示资讯| PPT|知识管理第856篇推文导读&#xff1a;经常看到什么LCD、LED、OLED、ULED、QLED、SLED、GLED……之类的名词&#xff0c;花里胡哨。别看那么多名词&#xff0c;但从显示技术角度看&#xff0c;现在市场上主流的电视机其实就两种&#xff1a;…

【转】Ubuntu 修改hosts

原文网址&#xff1a;http://l.14551.org/2009/12/2166 Ubuntu系统的Hosts只需修改/etc/hosts文件&#xff0c;在目录中还有一个hosts.conf文件&#xff0c;刚开始还以为只需要修改这个就可以了&#xff0c;结果发现是需要修改hosts。修改完之后要重启网络。具体过程如下&#…

一击即中的表白方式,学会了吗?

1 自己吃自己的&#xff0c;敢抢我吃的&#xff0c;吃我的小拳拳&#xff01;2 承受了太多哈哈哈3 狗狗在你不知道的时候会默默守护你4 眼前的方不是方。。5 一击即中的表白方式&#xff0c;学会了吗&#xff1f;&#xff1f; 图自甜星球日报社6 哦…了解了图自迷影心生 7 当90…

BIND的安装

ind建立步骤 1.解压bind安装文件tar zxvf bind-9.5.0.tar.gz2.进入bind安装目录cd bind-9.5.03.配置bind安装文件./configure --prefix/usr/local --enable-threads4.编译和安装bind文件make && make install5.建立主配置文件vi /etc/named.confoptions {directory &qu…

mysql2012用户名_SQL Server 登录名、服务器角色、用户名和数据库角色 --- 解释

1.一个数据库用户可以对应多个架构(架构是表容器)。架构里面包含的是数据库表。2.一个数据库角色有可能涉及多个架构。数据库角色对应的是权限。3.一个用户对应一个数据库角色。4.登录名与数据库用户在服务器级别是一对多的&#xff1b;在数据库级别是一对一的。服务器登录名&a…

有关转换问题

Convert.ChangeType 的运用 JOBEntity jobnew JOBEntity(); Type t job.GetType(); PropertyInfo[] info t.GetProperties(); foreach(PropertyInfo i in info){ //value 必须保证有效性&#xff0c;否则要对 PropertyType 进行 typeof 判断 if(i.PropertyType.IsGene…

Windows 11 正式版 ISO 镜像下载大全

Windows 11 ISO 镜像规格1.Windows 11 中文版文件大小&#xff1a;5.13 GB系统类型&#xff1a;64 位操作系统版本号&#xff1a;Windows 11 21H2发布日期&#xff1a;2021 年 10 月 5 日MD5: 68FB0CAD069CF82A9BA0996A6D3D112BSHA1: 9F602662FFAB0DF3B3A66FC6A42849BFFD3315A7…

怎样安装python在桌面_在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程...

什么是 Jupyter LabJupyter Lab 是 Jupyter notebook 的升级版&#xff0c;优点这里不作赘述。一、安装 Jupyter Lab如果你安装了 Anaconda&#xff0c;最新版的 Anaconda 自带 Lab&#xff0c;可跳过下面这一步。pip install jupyterpip install jupyterlab安装完后&#xff0…

common Lisp学习笔记(十二)

12 Structure and The Type Syetem 12.2 typep, type-of12.3 defining structures12.5 accessing, modifying structs12.6 kwargs to constructor functions12.7 修改结构体定义12.8 print func for structs12.9 equality of structs12.10 inheritance12 Structure and The Typ…

于明:APU能否接力取代迟暮的X86?

图&#xff1a;AMD Fusion APU中国发布会 有作用力必然有反作用力&#xff0c;有光亮也必然有黑暗&#xff0c;有诚实也必然有欺骗&#xff0c;任何事物都具有两面性&#xff0c;而PC的核心处理器也不例外&#xff0c;存在着“真融合”与“假融合”之分。 就拿AMD(NYSE: AMD)在…

SQL Azure Reporting CTP

http://blogs.msdn.com/b/azchina/archive/2011/02/18/sql-azure-reporting-limited-ctp-arrived.a概念SQL Azure Reporting 把云端报表作为服务来提供&#xff0c;构建于SQL Server Reporting Services 和 SQL Azure 技术之上。诸如SQL Azure Reporting此类云端报表服务具有许…

Windows 11 小技巧- winget安装和维护应用程序

安装好Windows 11后&#xff0c;你可能需要为系统安装常⽤的⼯具&#xff0c;例如安装Visual Studio Code&#xff0c;Google Chrome &#xff0c;VLC Player 等应⽤。以往你可能需要⾃⼰去各大网站上安装。如果你曾经使⽤Linux, 你可以通过命令⾏⽅式用apt安装和维护很多的…

经典语句,看看让心灵宁静

1.哈佛有一个着名的理论&#xff1a;人的差别在于业余时间&#xff0c;而一个人的命运决定于晚上8点到10点之间。每晚抽出2个小时的时间用来阅读、进修、思考或参加有意的演讲、讨论&#xff0c;你会发现&#xff0c;你的人生正在发生改变&#xff0c;坚持数年之后&#xff0c;…

输出毫秒_自学单片机第十三篇上:单点输出

关注一下&#xff0c;更多精彩等着你&#xff01;打开之前的工程&#xff0c;当然新建也可以&#xff0c;具体步骤看之前的文章就行。因为是学习&#xff0c;所以也用不着总是新建工程&#xff0c;起名起一大堆&#xff0c;接下来&#xff0c;除非要用两个执行文件&#xff0c;…