python 垃圾回收机制
引用计数
1、引用计数增加
a=100
b=a
c=a #100的引用计数为3
2、引用计数减少
del a
del b #100的引用计数为1
# 引用计数为0 的时候 100的内存地址就是垃圾了,会被python垃圾回收机制回收
3、变量三大组成部分
- 变量名
- 赋值符号
- 变量值
标记清除
循环引用导致内存泄漏
l1 = [1]
l2 = [2]
l1.append(l1)
l2.append(l2)
del l1
del l2
l1和l2的引用计数都不为0,但是又没有办法去访问到这两个变量值 造成循环引用
python会在内存空间不够用的时候,将程序暂停下来
1、扫描栈区
- 将可以通过栈区直接或者间接引用到的值,标记为存活状态。
- 将通过栈区引用不到的值,标记为死亡状态,会被直接清理掉(即使它引用计数不为0)
分代回收
垃圾回收机制到上面两部还有一个弊端:
- 基于引用计数的垃圾回收机制每次回收内存都需要把所有对象的引用计数都遍历一遍(效率低)
-
1、垃圾回收机制主要由引用计数来扫描并回收垃圾*
2、用标记清楚解决引用计数回收不了的垃圾
3、用粉黛回收解决引用计数扫描效率低的问题