栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python的内存管理和垃圾回收机制_python的内存管理特点?

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python的内存管理和垃圾回收机制_python的内存管理特点?

一、引用计数 1.统计有哪些变量引用指向了当前对象
1.1 当有新的引用指向的时候,引用计数+1
1.2 当有无效的引用发生的时候,引用计数-1
1.3 当对象的引用计算为0的时候,销毁对象
getrefcount 会创建一个
	>>> from sys import getrefcount
	>>> a =500
	>>> getrefcount(a)
	2                 		实际上应该为1,然后getrefcount也临时引用了,所以为2
	>>> b = a
	>>> getrefcount(a)
	3
	>>> lst = [a]
	>>> getrefcount(a)
	4
	>>> del a         		del删掉的都是引用,删掉了a的引用
	>>> getrefcount(b)
	3
2.引用计数可以解决大部分内存问释放题,但是无法解决循环引用的问题
	循环引用
	>>> x = [1]
	>>> y = [2]
	>>> x.append(y)
	>>> getrefcount(y)
	3
	>>> getrefcount(x)
	2
	>>> y.append(x)
	>>> getrefcount(x)
	3
	>>> x
	[1, [2, [...]]]
	>>> y
	[2, [1, [...]]]
	>>> del x
	>>> y
	[2, [1, [...]]]
	>>> x
	Traceback (most recent call last):
	  File "", line 1, in 
	NameError: name 'x' is not defined

二、垃圾回收:解决引用计数无法处理的循环问题 1.垃圾回收的定义:

垃圾回收时,Python不能进行其它的任务。频繁的垃圾回收将大大降低Python的工作效率。 当Python运行时,会记录其中分配对象(object allocation)和取消分配对象(object deallocation)的 次数。当两者的差值高于某个阈值时,垃圾回收才会启动

	>>> import gc
	>>> gc.get_threshold()
	(700, 10, 10)
2.三种情况触发垃圾回收
2.1 调用gc.collect()
2.2 GC达到阀值时 
2.3 程序退出时
3.垃圾回收

3.1 找垃圾–》分代回收
分代机制:
新建对象为0代,0代扫描十次,才会扫描一次1代,以此类推
0代在经历10次垃圾回收依然存活,就会变成1代,以此类推
扫描到了就会进行标记,标记了以后就会进去清除
3.2 清除垃圾–》标记清除–》清除循环引用的垃圾

三、内存泄漏和内存溢出 1.内存泄漏:有一部分内存无法被回收释放,进程又无法访问 2.内存溢出:(oom–》out of memory)内存不够用,程序需要的内存大于系统空闲的内存 四、内存缓冲池机制 1、整数对象缓冲池

对于[-5,256] 这样的小整数,系统已经初始化好,可以直接拿来用。而对于其他的大整数,系统则提 前申请了一块内存空间,等需要的时候在这上面创建大整数对象。

	>>> a = 1
	>>> b = 2
	>>> from sys import getrefcount
	>>> getrefcount(a)
	812
	>>> getrefcount(b)
	99
	>>> c=200
	>>> getrefcount(c)
	3
	>>> g = 1
	>>> getrefcount(g)
	813
	>>> a = -5
	>>> getrefcount(a)
	3
2、字符串驻留区

多个字符或者含有特殊字符的字符串不会放在驻留区的

	>>> str1 ="abc"
	>>> str2 ="abc"
	>>> id(str1)
	140697336108288
	>>> id(str2)
	140697336108288
	>>> str1 ="abc*"
	>>> str2 ="abc*"
	>>> str1 is str2
	False
五、python内存管理
**引用计数为主,分代回收和标记清除为辅的垃圾回收方式,进行内存回收管理
还引用了小整型缓冲池以及常用字符串驻留区的方式进行内存分配管理**
六、深拷贝和浅拷贝(不属于内存管理的内容) 1、深浅拷贝
主要是针对容器类型里面包含可变容器类型--》容器里面包容器
2、浅拷贝:只会拷贝第一层的数据地址 3、深拷贝:会拷贝每一层的值
import copy
>>> d1
{'a': [1, 2], 'b': 2}
>>> d2 = d1.copy()
>>> d2
{'a': [1, 2], 'b': 2}
>>> d1
{'a': [1, 2], 'b': 2}
>>> d1 is d2
False
>>> d1['a'].append(3)
>>> d1
{'a': [1, 2, 3], 'b': 2}
>>> d2
{'a': [1, 2, 3], 'b': 2}
>>> d2['a'].append(4)
>>> d2
{'a': [1, 2, 3, 4], 'b': 2}
>>> d1
{'a': [1, 2, 3, 4], 'b': 2}
>>> id(d1['a'])
140697298042952
>>> id(d2['a'])
140697298042952
>>> import copy
>>> d3 = copy.deepcopy(d1)
>>> d3 
{'a': [1, 2, 3, 4], 'b': 2}
>>> d3 is d1
False
>>> d3['a'].append(5)
>>> d3
{'a': [1, 2, 3, 4, 5], 'b': 2}
>>> d1
{'a': [1, 2, 3, 4], 'b': 2}
>>> lst = [[]]*3
>>> lst
[[], [], []]
>>> lst[0]
[]
>>> lst[0].append(1)
>>> lst
[[1], [1], [1]]

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/783463.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号