- A+
垃圾回收
Python与C#、 java 相同,都采用了垃圾收集机制,而不再是c,c++里用户自己管理维护内存的方式。
Python为了优化速度提供了小整数对象池、大整数对象池、inter机制
小整数对象池
Python 对小整数的定义是 [-5, 257) 这些整数对象是提前建立好的,不会被垃圾回收。在一个 Python 的程序中,所有位于这个范围内的整数使用的都是同一个对象.
同理,单个字母也是这样的。
大整数对象池
每一个大整数,均创建一个新的对象。
inter机制
共享
a=“hello”
b=“hello”
c=“hello ”
a b是相同的id,如果,c包含的内容包含空格,特殊的字符时id不同
GC 垃圾回收
引用计数:
在Python中,每个对象都保存了一个称为引用计数的整数值,来追踪到底有多少引用指向了这个对象。无论何时,如果我们程序中的一个变量或其他对象引用了目标对象,Python将会增加这个计数值,而当程序停止使用这个对象,则Python会减少这个计数值。一旦计数值被减到零,Python将会释放这个对象以及回收相关内存空间。
python采用的是引用计数机制为主,标记-清除和分代收集两种机制为辅的策略
在python中一切皆对象,核心为一个结构体PyObject:
typedef struct_object {
int ob_refcnt;
struct_typeobject *ob_type;
} PyObject;
PyObject是每个对象必有的内容,其中ob_refcnt就是做为引用计数。当一个对象有新的引用时,它的ob_refcnt就会增加,当引用它的对象被删除,它的ob_refcnt就会减少
当引用计数为0时,该对象生命就结束了。
引用计数机制的优点:
-
简单
-
实时性:一旦没有引用,内存就直接释放了。不用像其他机制等到特定时机。实时性还带来一个好处:处理回收内存的时间分摊到了平时。
引用计数机制的缺点:
-
维护引用计数消耗资源
-
循环引用
循环引用的情况
list1 = []
list2 = []
list1.append(list2)
list2.append(list1)
list 1和list2 的相互引用,list1与list2的引用计数也仍然为1,所占用的内存永远无法被回收 循环引用导致内存泄露
如果出现了对象的相互引用,那么就python就会遍历每个对象,检查对象中是否有相互引用的对象,删减其应用对象,
Gc模块
gc模块提供一个接口给开发者设置垃圾回收的选项。采用引用计数的方法管理内存的一个缺陷是循环引用,而gc模块的一个主要功能就是解决循环引用的问题。
垃圾回收问题,在实际开发中只需了解,如果有小伙伴们想进一步的学习,可在网上自行学习,也可私信我,分享相关资料