Python 标记清除机制

在讲标记清除之前,我们先讲一个知识点。就是我们前面讲了变量值在内存的存储方式,就是开辟内存空间,把值存进去。但是一直没有讲过变量名是存在哪里的,毫无疑问,变量名也是存在内存里的,至于到底怎么存的,我们来看一下。

当我们定义变量的时候,它有两部分要存,一部分是变量名,一部分是变量值。在内存里也是对应两块空间的。

我这里有个图,一个空间叫栈区,它专门用来存放变量名的,另一个空间叫堆取,它是专门用来存放变量值的。当我们定义一个name=‘张大仙’的时候,这时候在堆区里会申请一块内存空间,把值‘张大仙’存进去,对应一个内存地址。

然后在栈区里存放一个name,对应上刚刚的内存地址。当堆区的内存地址引用计数为0被清除的时候,对应栈区的变量名也会被清除。

好!堆区和栈区咱们简单了解一下就行了。

现在我们来看上章循环引用的案例。首先是列表l1,里面存了三个值,分别是‘a’,‘b’和列表l2的内存地址,然后列表l2存放了‘x’,‘y’和列表l1的内存地址

就是列表1间接引用了列表2的内存地址,列表2间接引用了列表1的内存地址,然后它们各自的变量名直接引用了各自内存地址。

当我们执行del l1之后,l1这个变量名就和它指向的内存地址接触绑定了。这时堆区里的这个l1被l2间接引用着的,所以不会被回收。

等待执行del l2的时候l2和它指向的内存地址也接除绑定了。这时候堆区里的l2有被上面的l1间接引用着的,所以l2也不会被回收。但是这两个列表没有直接引用了,意味着我们访问不到这两个列表了,这两个内存就泄露了

这时候就可以使用Python为我们提供的解决方法标记清除。

标记清除会在你内存空间不够用的时候将你整个程序暂停下来,扫描栈区,把通过栈区所有能引用到的值,不管是通过栈区直接引用还是间接引用到的,都标记为存活状态,一旦发现栈区引用不到的值都标记为死亡状态,死亡状态的值会被直接清理掉。

就算他身上的引用计数不为0,只要我们访问不到它了,标记清除就会把它标记为垃圾,然后回收掉。

我举个简单的例子你就明白了,你去遛狗,但是你没牵绳,一旦被城管发现了就会把你的狗回收掉。这个城管就相当于Python的标记清除机制。

未经允许不得转载:445IT之家 » Python 标记清除机制

赞 (1) 打赏

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏