首页 > 技术文章 > python垃圾回收机制

garyhtml 2021-11-02 18:14 原文

垃圾回收机制

image

什么为垃圾回收机制?

  • 在内存中没人任何变量指向的数据

为什么要用到垃圾回收机制?

  • 程序运行过程中会申请大量的内存空间,而对于一些无用的内存空间如果不及时清理的话会导致内存使用殆尽,导致系统崩溃,所以回收无用的内存空间是一件很繁琐的事情,而python解释器自带的垃圾回收机制把这件繁琐的事情解放了出来。
    image

在python中开发了一套自动化回收方案。

1. 引用计数

什么为引用计数:内存中变量值有几个变量引用他,引用计数就为几,引用计数为0即为垃圾。
比如:
x = 'aaa' 此时'aaa'这个数据引用计数为1
y = x 此时'aaa'这个数据引用计数为2

name = 'gary'
name = 'Gary'
print(name)
输出结果为 Gary。则name = 'gary' 引用计数为0即为垃圾 则被回收。

2.标记清除

当内存即将沾满的时候 python会自动暂停程序的执行 从头到尾将内存中数据进行扫描并打上标记 之后一次性清除掉标记的数据
它分为两个阶段:第一阶段是标记阶段,它会把所有的『活动对象』打上标记,第二阶段是把那些没有标记的对象『非活动对象』进行回收。那么它又是如何判断哪些是活动对象哪些是非活动对象的呢?
image
在上图中,我们把小黑圈视为全局变量,也就是把它作为root object,从小黑圈出发,对象1可直达,那么它将被标记,对象2、3可间接到达也会被标记,而4和5不可达,那么1、2、3就是活动对象,4和5是非活动对象会被它回收。

3.分代回收

分代回收会将数据的监管分为三个层次 随着层级的下降监督的频率降低
image
每新生成一个对象都会检查第0代有没有满,如果满了就开始着手进行垃圾回收.创建的对象都会分配在年轻代,年轻代链表的总数达到上限时,Python垃圾收集机制就会被触发,把那些可以被回收的对象回收掉,而那些不会回收的对象就会被移到中年代去,依此类推,老年代中的对象是存活时间最久的对象,甚至是存活于整个系统的生命周期内。同时,分代回收是建立在标记清除技术基础之上。分代回收同样作为Python的辅助垃圾收集技术处理那些容器对象.
image

推荐阅读