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

Python垃圾回收算法分区回收

时间:2023-03-06 12:43:16 网络应用技术

  分裂的回收是Java垃圾回收的核心算法。该算法基于这样的统计事实:对于程序,该程序中的存储器块生存周期很短,其余的存储器块将具有更长的生存周期,并且具有更长的生存周期,并且即使从计划到程序结束。短期生存期约为80%-90%。

  因此,可以考虑的时间越长,垃圾就越不可能,应收集的时间就越少。

  这样,可以在清除算法时可以有效减少可以穿越的物体数量,从而提高垃圾回收的效率。这是一种与空间交换的策略。

  Python将所有对象分为0,1,2三代人。

  所有新对象都是0代。

  当一代物体经历了垃圾回收并仍然生存时,它们将归因于下一代。

  每一代都由GC_Genration结构维护。结构中有三个变量。

  头字段:可以收集链接列表的头部,并通过链接列表维护代理中的对象。

  阈值场:只有计数超过此阈值时,Python垃圾回收操作才能扫描这一代的对象。

  计数字段:计数器,不同一代的统计项目不同。

  每个gc_genration链列表头节点头字段指向您自己,也就是说,每个集合对象链接列表在开始时为空。计数字段初始化为0,而阈值字段则具有其自己的策略。

  初始化完成后,三个相应的gc_generation数组大致如下:

  当Python调用PyObject_GC_Alloc以将内存分配给需要跟踪的对象时,该函数将添加第一代计数计数器的1个,然后将对象连接到第一个循环对象链接列表。释放内存对象存储器,该函数减去第一代计数计数器1.如果PyObject_GC_Alloc具有超过700个阈值的计数,则将调用Collection_Generations执行垃圾回收(GC)。

  collect_gientions函数从旧一代开始,逐一穿越每一代,并找到需要执行回收操作的最古老的一代。

  当收集功能处理一代一代时,计数,年轻计数计数器为0到0,然后删除其对象链接列表,用自己的缝线执行GCS算法,最后下一代将是下一代。加1。

  总而言之,有以下八点

  (1)对于系统的每个新添加对象,Python一次执行GC操作

  (2)创建对象后,它将随着时间的推移逐渐移至旧一代,恢复频率将逐渐减少

  (3)每11个新一代GC都进行,触发中间的GC

  (4)每11个中段GC都进行,触发旧一代GC(旧一代GC也受其他策略的影响,频率较低)

  (5)在每个GC操作中需要处理的一代可能会有所不同。

  (6)GC(Count> hreshold)需要在一定一代中进行,并且所有年轻一代都在其面前执行GC

  (7)执行多代GC,Python将其对象链接在一起并一次处理

  (8)执行GC后,计算清晰