python之垃圾回收机制

python之垃圾回收机制

在python编程过程中,会产生一些没有实际意义的数据,这些数据统称为垃圾数据,垃圾数据的堆积会占用内存空间,造成程序运行效率的下降,而这个时候,就需要用到垃圾回收机制

在python语言中,垃圾数据的回收是自动进行的,不需要认为的输入指令

而在python中垃圾回收分为引用计数、标记清除以及分代回收三种情况

  1. 引用计数

引用计数即按照数据值被引用的次数来判断它是否是垃圾数据

name = '李帆'  # '李帆'的引用次数为一
# 每当有一个变量名与这个数据值绑定,则意味着这个数据值被引用一次
name1=name  # '李帆'的引用次数加一,即现在该数据值引用次数为二
# 当多个变量名与同一个数据值绑定时,每增加一次绑定,那么该数据值的引用次数加一
当删除变量名name1之后,数据值的引用次数减去一,基于此原理,当一个数据值的引用次数为0时,就会作为垃圾数据被垃圾回收机制回收掉
  1. 标记清除

标记清除主要用于数据循环引用的情况下,数据值虽然仍引用次数,但已经不再具有实际意义、

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

如上图所示,当删除两组数据所对应的变量名后,虽然变量名与数据之间的引用关系已经不存在了,但两组数据之间的引用关系依旧是存在的,这样引用次数依旧是一,数据本身却不再具有实际意义

  1. 分代回收

分代回收可以理解为生产线的巡检员,当新员工到流水线后,经验不足,巡检员就会频繁到新员工所在的流水线巡视,但随着工龄累积,经验不断丰富,巡检员也会降低巡视的频率,而垃圾回收机制为了避免对内存资源的损耗,也有类似的一套系统

graph TD A(最新输入的数据)--->|进入到内存空间|B(A引用频率最低检测频率最高) B--->|引用频率增加|C(B引用频率较高检测频率较低) C--->|引用频率增加|D(C引用频率极高检测频率最低)

如上图所示,随着数据引用频率的增加,python会将数据划分为A、B、C三个等级,分别采取不同的监测策略,从而降低对内存资源的损耗

posted @ 2022-09-27 16:01  逐风若梦  阅读(134)  评论(0编辑  收藏  举报