1.引用计数
增加引用计数
- 对象被创建
x = 3.14 - 或另外的别名被创建
y = x - 或作为参数被传递(新的本地引用)
foobar(x) - 或成为一个容器的对象
myList = [123, x, ‘xyz]
- 对象被创建
减少引用计数
- 一个本地引用离开了其作用范围。比如foobar()函数结束时
- 对象的别名被显示销毁
del y # 执行del会产生两个结果 - 对象的一个别名被复制给其他对象
x = 123 - 对象从一个窗口对象中移除
myList.remove(x) - 窗口对象本身被销毁
del myList
2.循环引用
一个循环引用发生在当你至少有两个对象互相引用时,也就是即使其他所有引用都消失,其引用计数依然不为0,这时候仅靠引用计数显然是不够的
list1 = []
list2 = []
list1.append(list2)
list2.append(list1)
Python的垃圾收集器实际上是一个引用计数器和一个循环垃圾收集器,这种情况就需要循环垃圾收集器来处理了。
3.标记-清除
标记-清除机制,顾名思义,首先标记对象(垃圾检测),然后清除垃圾(垃圾回收)。
将引用计数为0的全都打上标记,等待GC循环检测回收
4.分代回收
分代技术简单点说就是:对象存在时间越长,越可能不是垃圾,应该越少去收集。
这样的思想,可以减少标记-清除机制所带来的额外操作,极大提高效率。