python入门之垃圾回收

  • A+
所属分类:编程语言

垃圾回收

Python与C#、 java 相同,都采用了垃圾收集机制,而不再是c,c++里用户自己管理维护内存的方式。

Python为了优化速度提供了小整数对象池、大整数对象池、inter机制

小整数对象池

Python 对小整数的定义是 [-5, 257) 这些整数对象是提前建立好的,不会被垃圾回收。在一个 Python 的程序中,所有位于这个范围内的整数使用的都是同一个对象.

同理,单个字母也是这样的。

大整数对象池

每一个大整数,均创建一个新的对象。

inter机制

共享

a=“hello”

b=“hello”

c=“hello ”

python入门之垃圾回收

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模块的一个主要功能就是解决循环引用的问题。

垃圾回收问题,在实际开发中只需了解,如果有小伙伴们想进一步的学习,可在网上自行学习,也可私信我,分享相关资料

weinxin
我的微信公众号
爱真理,得永生!          爱在灵灵久博客,网罗天下,福利大家!

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: