redis 回收机制,redis常见的回收策略

  redis 回收机制,redis常见的回收策略

  引用次数

  Python默认采用的垃圾收集机制是“引用计数”,最早由George E. Collins在1960年提出,50年后的现在也有很多程序。

  “引用计数法”的原理是为每个对象维护ob_ref字段,记录该对象当前被引用的次数,每有一个新的引用指向该对象,引用计数ob_ref增加1,对象引用每失败一次,ob_ref增加1。

  缺点:它的缺点是需要额外的空间来维护引用计数。这个问题仅次于这个,但最大的问题是不能解决对象的“循环引用”。所以很多语言并没有像Java一样在垃圾收集机制中采用这种算法。

  进口系统

  A类() :

  def __init__(self):

  ""初始化对象" "

  Print (objectbornid:% s)% str(十六进制)id (self))

  定义f1)):

  ""循环引用" "

  虽然正确:

  c1=A()).

  c2=A()).

  c1.t=c2

  c2.t=c1

  戴尔C1公司

  戴尔C2公司

  实例化c1和c2时,两个对象的引用计数都是1,运行c1.t=c2和c2.t=c1时,引用计数都是2。

  del c1之后,内存c1中的对象引用数是1而不是0,所以c1中的对象不会被丢弃。同样,戴尔C2之后也是如此。

  这两个对象都可以销毁,但是由于循环引用,垃圾收集器不会回收它们,从而导致内存泄漏。

  清楚标明

  —Sweep算法是一种基于跟踪GC技术的垃圾收集算法。这分为两个阶段。第一阶段是标记阶段,GC标记所有“活动对象”,第二阶段回收未标记的对象“非活动对象”。那么,GC是如何判断活动对象和非活动对象的呢?

  对象通过引用(指针)连接起来,形成一个有向图。对象形成有向图的节点,引用关系形成有向图的边。从“根对象”开始,沿着有向边遍历对象,可到达的对象标记为活动对象,不可到达的对象是要清除的非活动对象。对象是全局变量、调用栈和寄存器。Mark-sweepg在上图中,黑色圆圈被视为全局变量。也就是说,它被称为根对象。从黑圈开始,如果物体1能直接到达,就会被标记,如果物体2和3能间接到达,也会被标记;如果对象4和5无法到达,1、2和3是活动对象,4和5是非活动对象,它们将被GC回收。

  标记算法主要使用容器对象(如list、dict、tuple、instance)作为帮助Python回收垃圾的技术。因为它不会导致对字符串或数字对象的循环引用问题。Python双向链表用于组织这些容器对象。但是,这种简单粗暴的标签去除算法也有明显的缺点。

  缺点:在清除非活动对象之前,必须依次扫描整个堆内存,即使只剩下少量活动对象,也必须扫描所有对象。

  逐代回收

  世代循环是空间交换时间的运作方式。Python根据对象的生存期将内存分为不同的集合,每个集合称为一代。Python内存分为三个“代”,分别对应于年轻一代(0代)、中间一代、老一代)和老一代),它们的垃圾收集频率对应于对象的存活。

  所有新创建的对象都将被分配给年轻一代。当年轻代的链表总数达到上限时,将启动Python垃圾收集机制,收集可以收集的对象,不能收集的对象将移至中期。所以年代较早的对象是存活时间最长的对象,在整个系统的生命周期中也是存活的。

  此外,逐代回收是基于标记去除技术。回收还将那些容器对象作为Python的辅助垃圾收集技术来处理。

  希望以上就是正文的全部内容,对大家的学习有所帮助。另外,请支持我们。

  时间:2020年4月26日

redis 回收机制,redis常见的回收策略