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日