内存管理

 

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,则就将其回收。