python内部使用引用计数,来保持追踪内存中的对象,python内部记录着所有使用中的对象各多少引用,即引用计数,当对象被创建时就创建了一个引用计数,当对象不再需要时,这个对象的引用计数为0时,它被垃圾回收。
引用计数增加的情况:
1.对象被创建,即将一个对象赋给一个变量时(变量实际就是对象的一个名字,右边的是一个对象)
x=3.14
2.或另外的别名被创建
y=x
3.作为参数传递给函数(新的本地引用)
foo(x)
4.成为容器对象的一个元素
lst=[12,"x",x]
引用计数减少的情况:
1。当变量被赋值给另外一个对象,原对象的引用计数也会自动减1
foo="as"
bar=foo
foo=123
2.一个本地引用离开了其作用范围,如foo(x)函数结束
3.对象的一个别名被赋值给其它的对象
4.对象的别名被显式的销毁 del y
5.对象被从一个窗口对象中移除 lst.remove(x)
6.窗口对象本被销毁 del lst
x=1
y=x
(del 从现在的名字空间中删除y,x的引用计数减1)
不会被使用的内存会被垃圾收集机制释放掉
垃圾回收机制还有一个循环垃圾回收器, 确保释放循环引用对象(a引用b, b引用a, 导致其引用计数永远不为0)
python中实现内存泄露的技术
class A(object):
def __init__(self):
print "%S born" % id(self)
def __del__(self):
print "delete %s" % id(self)
class B(object):
def __init__(self):
print "%S born" % id(self)
def __del__(self):
print "delete %s" % id(self)
a=A()
b=B()
a.B=b
b.A=a
del a
del b