当前位置: 首页 > 网络应用技术

Python垃圾恢复摘要

时间:2023-03-08 15:56:22 网络应用技术

  最近,我阅读了“垃圾回收的算法和实施”,该内容谈到了一些常用的垃圾收集算法,例如:标签回顾,参考计数,发电,回收等等。。

  Python使用参考计数的GC算法。参考的优点计数算法是可以缩短参考算法的数量。

  对于Python数据,例如列表,设置,元组,dict,str,int,将会

  成员负责维护参考计数。所有构建的结构都在开始时保留结构,以维持参考计数。

  python在执行内存分配时不仅会调用一个函数以从操作系统请求内存。iNSTEAD,系统调用会尽可能减少系统调用,并将内存分配器分为3层。

  第三层是Python的分配设备级别。如果以字典对象为示例,

  第0层是直接由操作系统提供的分布函数,例如,python并不是制作成都呼叫的0层的所有对象,而是基于内存的大小选择不同的分布解决方案以分配内存:

  根据经验,编码过程中使用的大量对象小于256个字节,例如::::::::

  在此过程中,如果频繁通话和效率,效率将非常低。Python将通过添加到第一层和第二层和第二层和第二层来增加第一层和第二层的管理空间的管理。当分布对象的内存小于256时,请使用此部分空间。

  Python管理的记忆结构的3部分:它们之间的关系如下:

  为了避免频繁调用,第一层的分配者将保留最大的单元竞技场的内存。池是有效管理空间的块。

  第二层上的分配器负责管理池中的块。返回块的开头转到申请人和释放块等。分销商将根据8字节的大小将池划分,然后产生几个块,例如:8个字节块,16个字节块,24个字节块,... 256字节的字节,256字节bytesblock。当申请内存时,它将返回合适的尺寸块。

  第三层是对象的唯一分配器。python中的各种构建类型:例如:列表,dict等,并且将有自己独特的分配器,例如DICS分销商的长度:

  分配字典对象时,您将首先检查是否有空闲列表的可用对象。如果您已经使用过,您将通过第二级申请对象。

  当Python生成整个字典时的交互:如下:

  Python中的参考计数方法实际上是对每个对象的参考数量的相应操作。如果对象的参考数量增加,请将1加入计数器。如果数量减少,则在柜台上将减少1。

  实际计数操作由宏实现

  该类型是在32位环境中的INT,在64位环境中是长的。字节,即使所有指针都引用了计数器,它也不会溢出。设计允许存在负数以促进调试。当参考计数器中有负数时,可能会导致过度降低操作或增量操作。

  实际计数操作由宏实现

  首先,将量化计数器数。如果不是0,请调用宏检查参考计数器是否变为负。如果计数器为0,则调用宏,以识别对象的类型并调用每个对象的相应函数指针,例如函数指针负责释放元组组的对象。

  成员具有每个对象的释放处理功能指针,其中大多数调用其中的函数

  乌龟组的呼叫操作呼叫图如下:

  参考计数的核心操作上面已经说明是计数+1和-1。需要清楚的是,谁负责操作,例如:对象a通过调用函数来获得b对象,那么谁应该谁负责对象b的对象b的参考计数?这涉及“参考所有权”,也就是说,持有参考所有权的人,当不需要此参考时,谁负责减少对象的参考计数器的任何人。

  1.传递参考所有权(返回值)

  也就是说,函数方将所引用的所有权交给了呼叫者。该功能的收件人负责在参考文献结束时执行减少操作。生成对象后,它将给予引用的所有者致电政党,例如:字典对象的产生

  2.借用所有权(退货价值)

  也就是说,函数方仅将返回值给呼叫方。至于参考的所有权,仅借用它。呼叫者无法减少参考计数。负责从“集合”中获取元素的功能是借用所有权

  3.占用所有权(参数)

  也就是说,当呼叫方将参数传递给函数时,函数方有时会占据此参数的参考所有权。目前,函数方负责参数的参考管理。将元素添加到链接列表中的函数将占据参数的所有权,例如:将元素添加到指定位置到yuan的函数团体

  4.贷款给所有权(参数)

  也就是说,呼叫方借出了函数方参数的所有权。当函数的呼叫方希望借用参考的所有权,从对象的末尾到函数,直到函数执行函数的结尾,在此期间,呼叫者必须保留对对象的参考的所有权。

  参考计数方法具有缺陷,无法解决周期参考的问题。当两个对象彼此引用时,无法清除参考计数,也就是说,无法执行GC。因此,通过循环参考求解Python。

  例如,在下图中,左侧的三个对象之前有一个周期参考,导致正常参考计数无法回收

  我们首先将其当前参考计数复制到另一个领域进行后续操作

  有一个前提:生成时,Python对象将其本身将其自身连接到一个(两个路点相互连接)。

  基于此,我们遍历中的所有对象,复制它们引用的所有对象的副本

  现在操作,我们被标记为所有对象在上一步处理后仍大于0。连接到可访问的链接列表;然后用0副本记录对象,为“无法到达对象”,并连接到无法满足链接列表。

  可以看出,未引用的对象是引用的对象。接下来,我们将在对象的链接列表中的对象中释放内存。

  此时,我们已经完成了周期参考对象的垃圾回收率。

  周期参考的根本原因是对可能保留到其他对象的其他对象的引用。对于这种类型的对象,我们称其为“容器对象”。元素组,列表和字典属于容器对象,只需要解决对这些容器对象的循环引用的问题。容器对象被分配给回收循环参考垃圾回收的头部结构。

  如前所述,当生成容器时,它将连接。以字典对象为例。

  负责连接到中间的操作

  Python将上述链接的链接列表分为“ 0代”,“第一代”,“第二代”,通过以下结构管理

  一开始,所有容器对象都连接到0世代的对象。当循环后,0世代容器的对象引用垃圾回收时,仍将生存的对象升级为第一代。从循环参考废物募集中存活的对象将其促进到2代。

  在参考垃圾回收的过程中,我们将从无法到达链接列表中删除一些对象

  原因是因为周期引用的终端的对象非常麻烦。我们无法确定当对象首先释放时,如果第一个对象首先释放,然后在释放第二个对象时执行的终结设备,如果引用第一个对象,该怎么办?

  对于这些包含终端的循环参考垃圾对象,Python提供了全局变量,从而使开发人员可以从应用程序的角度从应用程序中删除周期引用。

  Python的GC分为两个部分: