谈谈python垃圾回收机制
作者:Sean_Yang
什么是垃圾回收机制?
首先,咱先来解释名词,垃圾回收是不是就是将没用的,废弃的东西回收起来。
在坐的各位都没有女朋友对吧,那难以想象你们的房间会是一个什么样子,可能会有很多垃圾,很凌乱,自己也不收拾。那当你有了女朋友了就不一样了,她会帮你收拾房间,把没用的垃圾都给你扔掉。
那在我们Python当中的垃圾回收承担的就是女朋友的角色,你们想象一下,你现在有一个轻度强迫症的女朋友一刻不停的跟在你的背后打扫卫生,你一放下脏碟子或者垃圾什么的,就已经帮你清理、打扫了
所以垃圾回收机制就是自动帮助我们管理内存,清理垃圾的一种工具
垃圾回收机制有什么用?
那我们现在先来想一想,我们平时在写程序的时候是不是会定义一些变量名,那这些变量名都是存在哪些地方呢?是不是都是存在内存里面,那当我们一直不停的定义变量是不是就会使我们内存空间的占有率增加,那我们的垃圾回收机制就会将一些没用的名字,没用的垃圾自动的回收起来。
识别垃圾对象,从垃圾对象那里回收内存
怎么进行垃圾回收
在我们Python当中采用的是引用计数机制为主,分代收集机制为辅的策略。
1、引用计数
在Python中,大多数对象的生命周期都是通过对象的引用计数来管理的。从广义上来讲,引用计数也是一种垃圾收集机制,而且也是一种最直观,最简单的垃圾收集技术。
引用计数的原理:
当一个对象的引用被创建或者复制时,对象的引用计数加1;
当一个对象的引用被销毁时,对象的引用计数减1;
当对象的引用计数减少为0时,就意味着对象已经没有被任何人使用了,可以将其所占用的内存释放了。
引用计数有一个致命的弱点就是是循环引用(也称交叉应用)。
循环引用可以使一组对象的引用计数不为0,然而这些对象实际上并没有被任何外部对象所引用,它们之间只是相互引用。
这意味着不会再有人使用这组对象,应该回收这组对象所占用的内存空间,然后由于相互引用的存在,
每一个对象的引用计数都不为0,因此这些对象所占用的内存永远不会被释放。
优点:
简单、直观
实时性,只要没有了引用就释放资源。
缺点:
维护引用计数需要消耗一定的资源
循环应用时,无法回收。也正是因为这个原因,才需要通过标记-清理和分代收集机制来辅助引用计数机制。
2、标记-清除
“标记-清除”是为了解决循环引用的问题。可以包含其他对象引用的容器对象(比如:list,set,dict,class,instance)都可能产生循环引用。
标记-清除原理:
“标记-清除”不改动真实的引用计数,而是将
集合中对象的引用计数复制一份副本,改动该对象引用的副本。对于副
本做任何的改动,都不会影响到对象生命走起的维护。
3、分代回收
分代回收原理:
将系统中的所有内存块根据其存活时间划分为不同的集合,
每一个集合就成为一个“代”,垃圾收集的频率随着“代”的存活时间的增大而减小。
也就是说,活得越长的对象,就越不可能是垃圾,就应该减少对它的垃圾收集频率。
那么如何来衡量这个存活时间:通常是利用几次垃圾收集动作来衡量,
如果一个对象经过的垃圾收集次数越多,可以得出:该对象存活时间就越长。
以上就是谈谈python垃圾回收机制的详细内容,更多关于python垃圾回收机制的资料请关注脚本之家其它相关文章!