[基础][垃圾回收] 1 引用计数
1. 前言
垃圾回收,主要通过引用计数进行垃圾回收;通过 “标记-清除” 解决容器对象可能产生的循环引用问题;通过 “分代回收” 以空间换时间的方法提高垃圾回收效率。
今天介绍引用计数。
https://zhuanlan.zhihu.com/p/83251959
2. 什么是引用计数
原理:每个对象维护一个ob_ref字段,用来记录此对象被引用的次数。
导致引用计数+1的情况:
- 对象被创建,例如
a=1
- 对象被引用,例如
b=a
- 对象被作为参数,传入到一个函数中,例如
func(a)
- 对象作为一个元素,存储在容器中,例如
list1=[a,a]
导致引用计数-1的情况:
- 对象的别名被显式销毁,例如
del a
- 对象的别名被赋予新的对象,例如
a=2
- 一个对象离开它的作用域,例如f函数执行完毕时,func函数中的局部变量(全局变量不会)
- 对象所在的容器被销毁,或从容器中删除对象
sys.getrefcount(a)查看引用计数的次数
3.引用计数的缺点
循环引用:假如内部产生两个循环调用的时候,就算删除掉外部的两个引用,这两个实例都不会被回收机制回收,因为他们仍然存在引用
实例待补全。
开源永流传