1 垃圾回收机制
引用计数机制为主,标记-清除和分代回收为辅。标记-清除机制用来解决计数引用带来的循环引用而无法释放内存的问题,分代回收机制是为提升垃圾回收的效率。
2 引用计数
引用计数增加:
- 一个对象被分配一个新名字
- 将其放入一个容器
减少:
- 使用 del 语句显式销毁
- 所在的容器销毁或者从容器中删除对象
- 别名超出作用域或被重新赋值
import sys
a=[1,2]
print(sys.getrefcount(a)) # 2
b=a
print(sys.getrefcount(a)) # 3
print(sys.getrefcount(b)) # 3
del b
print(sys.getrefcount(a)) # 2
c=[]
c.append(a)
print(sys.getrefcount(a)) # 3
del c
print(sys.getrefcount(a)) # 2
b=a
print(sys.getrefcount(a)) # 3
print(sys.getrefcount(b)) # 3
a=[3,4]
print(sys.getrefcount(a)) # 2
print(sys.getrefcount(b)) # 2
3 标记-清除
循环引用只有在容器对象才会产生:字典、元组、列表等。
两步:
- 标记阶段,遍历所有对象,如果对象 reacheble,则标记为可达。
- 清除阶段,再次遍历对象,如果某个对象没有标记为 reacheble,则就将其回收。