python对内存回收引用几个概念
计数器:当python程序运行时,会根据数据类型的不同找到相对应的结构体,根据结构体中的字段来进行创建相关的数据。然后将对象添加到refchain双向链表中。每个对象中有ob_refcnt就是计数器。默认值为1,当有其他变量引用对象时,引用计数器就会发生变化
a=999
b=a #a对象的计数器此时从1变为2,因为b引用一次a
del b #b变量删除,b对应对象引用的计数器值-1
del a #a变量删除,a对应对象引用的计数器值-1
当一个对象引用的计数器为0时,意味着没有人使用这个变量,此时将该对象进行垃圾回收,首先先将该对象从refchain双向链表中移除,最后将该对象进行销毁,释放内存
标记清除:
但是在python中会存在循环引用的情况,为了解决这个问题,python引用了标记清除的概念
v1=[1,2,3]
v2=[4,5,6]
v1.append(v2) #此时v1计数器值为2
v2.append(v1) #此时v2计数器值为2
del v1 #删除后,v1计数器值为1,并不为0,导致不会将该对象清除,所以内存不被释放,这就是计数器循环引用的问题
del v2
标记清除(Mark—Sweep)算法是一种基于追踪回收(tracing GC)技术实现的垃圾回收算法。它分为两个阶段:第一阶段是标记阶段,GC会把所有的活动对象打上标记,第二阶段是把那些没有标记的对象非活动对象进行回收。
分代回收:
分代回收是建立在标记清除技术基础之上的,是一种以空间换时间的操作方式。Python将内存根据对象的存活时间划分为不同的集合,每个集合称为一个代,Python将内存分为了3“代”,分别为年轻代(第0代)、中年代(第1代)、老年代(第2代),他们对应的是3个链表,它们的垃圾收集频率与对象的存活时间的增大而减小。新创建的对象都会分配在年轻代,年轻代链表的总数达到上限时,Python垃圾收集机制就会被触发,把那些可以被回收的对象回收掉,而那些不会回收的对象就会被移到中年代去,依此类推,老年代中的对象是存活时间最久的对象,甚至是存活于整个系统的生命周期内。
标签:v1,python,回收,对象,计数器,垃圾,引用 From: https://www.cnblogs.com/powfu/p/16884970.html