Chow's Notes

Python内存管理机制

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中实现内存泄露的技术

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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)
while True:
a=A()
b=B()
a.B=b
b.A=a
del a
del b