python之垃圾回收机制
python之垃圾回收机制
在python编程过程中,会产生一些没有实际意义的数据,这些数据统称为垃圾数据,垃圾数据的堆积会占用内存空间,造成程序运行效率的下降,而这个时候,就需要用到垃圾回收机制
在python语言中,垃圾数据的回收是自动进行的,不需要认为的输入指令
而在python中垃圾回收分为引用计数、标记清除以及分代回收三种情况
- 引用计数
引用计数即按照数据值被引用的次数来判断它是否是垃圾数据
name = '李帆' # '李帆'的引用次数为一
# 每当有一个变量名与这个数据值绑定,则意味着这个数据值被引用一次
name1=name # '李帆'的引用次数加一,即现在该数据值引用次数为二
# 当多个变量名与同一个数据值绑定时,每增加一次绑定,那么该数据值的引用次数加一
当删除变量名name1之后,数据值的引用次数减去一,基于此原理,当一个数据值的引用次数为0时,就会作为垃圾数据被垃圾回收机制回收掉
- 标记清除
标记清除主要用于数据循环引用的情况下,数据值虽然仍引用次数,但已经不再具有实际意义、
l1 = [11, 22] # 引用计数为1
l2 = [33, 44] # 引用计数为1
l1.append(l2) # l1 = [11, 22, l2列表] 引用计数为2
l2.append(l1) # l2 = [33, 44, l1列表] 引用计数为2
del l1 # 断开变量名l1与列表的绑定关系 引用计数为1
del l2 # 断开变量名l2与列表的绑定关系 引用计数为1
在上述情况下,会产生两组有引用次数但是已经不再具有实际意义的数据值
当内存占用率达到一定程度后,系统会扫描出这种垃圾数据,打上标记,然后一次性清除
graph LR
A(变量名l1)-.->|断开|B(列表1)
C(变量名l2)-.->|断开|D(列表2)
B-->|引用|D
D-->|引用|B
如上图所示,当删除两组数据所对应的变量名后,虽然变量名与数据之间的引用关系已经不存在了,但两组数据之间的引用关系依旧是存在的,这样引用次数依旧是一,数据本身却不再具有实际意义
- 分代回收
分代回收可以理解为生产线的巡检员,当新员工到流水线后,经验不足,巡检员就会频繁到新员工所在的流水线巡视,但随着工龄累积,经验不断丰富,巡检员也会降低巡视的频率,而垃圾回收机制为了避免对内存资源的损耗,也有类似的一套系统
graph TD
A(最新输入的数据)--->|进入到内存空间|B(A引用频率最低检测频率最高)
B--->|引用频率增加|C(B引用频率较高检测频率较低)
C--->|引用频率增加|D(C引用频率极高检测频率最低)
如上图所示,随着数据引用频率的增加,python会将数据划分为A、B、C三个等级,分别采取不同的监测策略,从而降低对内存资源的损耗