首页 / PYTHON / python之垃圾回收机制
python之垃圾回收机制
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python之垃圾回收机制,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3825字,纯文字阅读大概需要6分钟。
内容图文
![python之垃圾回收机制](/upload/InfoBanner/zyjiaocheng/807/bbd5623bdcaa49978b81d5af3dd0eaf3.jpg)
一、对象池
小整数对象池
1). 整数在程序中的使用非常广泛,Python为了优化速度,使用了小整数对象池,避免为整数频繁申请和销毁内存空间。
2). Python对小整数的定义是[-5,257) 这些整数对象是提前建立好的,不会被垃圾回收。在一个Python的程序中,所有位于这
个范围内的整数使用的都是同一个对象.
大整数对象池
每一个大整数,均创建一个新的对象。
字符串驻留机制
string interning(字符串驻留): 它通过维护一个字符串常量池(string intern pool),从而试图只保存唯一的字符串对象,达到既高效又节省内存地处理字符串的目的。
在创建一个新的字符串对象后,Python 先比较常量池中是否有相同的对象(interned),有的话则将指针指向已有对象,并减少新对象的指针,新对象由于没有引用计数,就会被垃圾回收机制回收掉,释放出内存。
注意:字符串(含有空格),不可修改,没开启intern机制,不共用对象,引用计数为0,销毁。
什么是内存溢出与内存泄露?
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,
出现out of memory;
内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存
泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。如果发生内
存泄露,那么可用内存会逐渐减少,从而降低性能。
python采用的是引用计数机制为主,标记-清除和分代收集两种机制为辅的策略
1、引用计数
python里每一个东?都是对象,它们的核心就是结构体: PyObject,用来记录当前对象被引用的次数,也就是来追踪到底有多少引用指向了这个对象,当引用计数为0时,该对象生命就结束了。
当发生以下四种情况的时候,该对象的引用计数器+1
1). 对象被创建,例如a=12
2). 对象被引用,例如b=a
3). 对象被作为参数,传入到一个函数中,例如func(a)
4). 对象作为一个元素,存储在容器中,例如list1=[a,a]
与上述情况相对应,当发生以下四种情况时,该对象的引用计数器-1
1). 对象的别名被显式销毁,例如del a
2). 对象的别名被赋予新的对象,例如a=24
3). 一个对象离开它的作用域,例如f函数执行完毕时,func函数中的局部变量(全局变量不会)
4). 对象所在的容器被销毁,或从容器中删除对象
引用计数的优缺点
优点
1). 简单
2). 实时性:一旦没有引用,内存就直接释放了。不用像其他机制等到特定时机。实时性还带来一个好处:处理回收内存的时间分摊到了平时。
缺点:
1), 维护引用计数消耗资源
2). 循环引用
申请两个内存空间, 变量list1和变量list2分别指向不同的内存空间, 引用计数全为1
import gc
# 关闭python自动实现的垃圾回收机制;
gc.disable()
while True:
list1 = []
list2 = []
# 在容器list1里面存储了list2, list2的引用计数加1;
list1.append(list2)
# 在容器list2里面存储了list1, list1的引用计数加1;
list2.append(list1)
为了解决这两个致命弱点,Python又引入了以下两种GC机制。
2、标记-清除
如它的字面意思一样,GC 标记 - 清除算法由标记阶段和清除阶段构成。标记阶段是把所有活动对象都做上标记的阶段。清除阶段是把那些没有标记的对象,也就是非活动对象回收的阶段。通过这两个阶段,就可以令不能利用的内存空间重新得到利用。
如果说被标记的对象是存活的,剩下的未被标记的对象只能是垃圾,这意味着我们的代码不再会使用它了。清除这些无用的垃圾对象,把它们送回到可用列表.
3、分代回收
分代垃圾回收(Generational GC)在对象中导入了“年龄”的概念,通过优先回收容易成为垃圾的对象,提高垃圾回收的效率。
新生代对象和老年代对象:
1). 分代垃圾回收中把对象分类成几代,针对不同的代使用不同的 GC 算法,我们把刚生成的对象称为新生代对象,到达一定年龄的对象则称为老年代对象。
2). 新生代 GC 将存活了一定次数的新生代对象当作老年代对象来处理。我们把类似于这样的新生代对象上升为老年代对象的情况称为晋升(promotion)。
3). 老年代对象很难成为垃圾,所以我们对老年代对象减少执行 GC 的频率, 从而提高效率。
分代回收是一种以空间换时间的操作方式,Python将内存根据对象的存活时间划分为不同的集合,每个集合称为一个代,Python将内存分为了3“代”,分别为年轻代(第0代)、中年代(第1代)、老年代(第2代),他们对应的是3个链表,它们的垃圾收集频率与对象的存活时间的增大而减小。新创建的对象都会分配在年轻代,年轻代链表的总数达到上限时,Python垃圾收集机制就会被触发,把那些可以被回收的对象回收掉,而那些不会回收的对象就会被移到中年代去,依此类推,老年代中的对象是存活时间最久的对象,甚至是存活于整个系统的生命周期内。同时,分代回收是建立在标记清除技术基础之上。分代回收同样作为Python的辅助垃圾收集技术处理那些容器对象.
内容总结
以上是互联网集市为您收集整理的python之垃圾回收机制全部内容,希望文章能够帮你解决python之垃圾回收机制所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。