python的内存管理与垃圾回收机制学习
Posted 挖洞的土拨鼠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python的内存管理与垃圾回收机制学习相关的知识,希望对你有一定的参考价值。
一、python内存申请:
1、python的内存管理分为六层:最底的两层有OS控制。第三层是调用C的malloc和free等进行内存控制。第四层第五层是python的内存池。最上层使我们接触的直接对python对象进行操作。
2、python申请对象时候小于256Byte的字节申请回直接使用python自己的内存分配系统,当大于256Byte的时候会调用malloc直接分配一个256k的大内存空间。释放内存空间时候会回收到内存池中而不是直接调用free释放掉。
3、深浅拷贝的不同(id☞内存地址):
(1)深拷贝(基本数据类型:整型、浮点、字符串、元祖、列表等)【a=x ; b=a ; a变b不变的情况】一个变化后两者id就不一样了,之前是一样的。(会新增一块地址)
1 Python 2.7.9 (default, Dec 10 2014, 12:28:03) [MSC v.1500 64 bit (AMD64)] on win32 2 Type "help", "copyright", "credits" or "license" for more information. 3 >>> a = 1 4 >>> b = a 5 >>> id(a) 6 6579496L 7 >>> id(b) 8 6579496L 9 >>> a = 2 10 >>> id(a) 11 6579472L 12 >>> id(b) 13 6579496L 14 >>>
(2)浅拷贝(数据结构数据类型:字典等)【a=x ; b=a ; a变b也变的情况】一个变化后两者id仍然一样,之前是一样的,且修改前后id不变。(不会新增一块地址)
1 Python 2.7.9 (default, Dec 10 2014, 12:28:03) [MSC v.1500 64 bit (AMD64)] on win32 2 Type "help", "copyright", "credits" or "license" for more information. 3 >>> a = [1,2,3] 4 >>> b = a 5 >>> id(a) 6 45528520L 7 >>> id(b) 8 45528520L 9 >>> a = [1,2,3,4] 10 >>> id(a) 11 45643272L 12 >>> id(b) 13 45528520L 14 >>> a 15 [1, 2, 3, 4] 16 >>> b 17 [1, 2, 3] 18 >>> a = {"a":1,"b":2} 19 >>> b = a 20 >>> 21 >>> 22 >>> id(a) 23 45672376L 24 >>> id(b) 25 45672376L 26 >>> a["a"] = 3 27 >>> id(a) 28 45672376L 29 >>> id(b) 30 45672376L 31 >>> b 32 {\'a\': 3, \'b\': 2} 33 >>>
二、python的垃圾回收机制:
1、首先python垃圾回收机制是以引用计数为主,划代分类为辅。
2、引用计数:当有一个对象引用了目标对象,目标对象引用计数就加一。反向操作则引用计数减一,当引用计数为0时候则删除对象。
3、类对象和基本数据类型对象的(析构函数)__del__:
1 class A: 2 def __init__(self): 3 print "create object" 4 def __del__(self): 5 print "delete object" 6 7 # a = A() 8 # del a 9 #其他类型: 10 #a = 10 11 #b = "ssss" 12 #del a 13 #del b
4、引用计数+1情况:
(1)对象被创建,例如
a=23
(2)对象被引用,例如
b=a
(3)对象被作为参数,传入到一个函数中,例如
func(a)
(4)对象作为一个元素,存储在容器中,例如
list1=[a,a]
5、引用计数-1的情况:
(1)对象的别名被显式销毁,例如
del a
(2)对象的别名被赋予新的对象,例如
a=24
(3)一个对象离开它的作用域,例如f函数执行完毕时,func函数中的局部变量(全局变量不会)
(4)对象所在的容器被销毁,或从容器中删除对象
6、注明:
函数调用变量A,A的引用计数+2 因为还有一步传参。
7、gc模块
1 #引用lib文件 2 import gc #gc模块文件 is_enable()=True才会启动垃圾自动回收 3 import sys 4 5 gc.set_debug(gc.DEBUG_STATS|gc.DEBUG_LEAK)#打开gc模块调试信息 6 7 #获取目标对象的引用计数 8 a = [] 9 b = a 10 print sys.getrefcount(a) 11 print sys.getrefcount(b) 12 13 gc.collect(para) #返回unreachable对象的个数。循环应用的引用计数非0,但是也是垃圾,呗收入gc.garbage但是不删除。 14 #para = 0,1,2 0检查第一代对象 1检查一、二代对象 2检查一、二、三代对象。 15 16 gc.set_threshold(threshold0[,threshold1[,threshold2]])#自动执行垃圾回收的频率 17 gc.get_count()#获取当前自动执行垃圾回收的计数器,长度为3的一个list 18 19 #垃圾回收有一个阈值 假设阈值(700,10,10)那么到了(699+1,x,x)时候就会启动。
8、参考资料(鸣谢):
http://www.cnblogs.com/Xjng/p/5128269.html
http://blog.csdn.net/yueguanghaidao/article/details/11274737
http://www.cnblogs.com/CBDoctor/p/3781078.html
以上是关于python的内存管理与垃圾回收机制学习的主要内容,如果未能解决你的问题,请参考以下文章
[新星计划] Python内存管理 | 引用计数垃圾回收内存池机制
[新星计划] Python内存管理 | 引用计数垃圾回收内存池机制