蓝盟IT外包,Python为什么不需要太关注垃圾回收呢?

发布者:上海IT外包来源:http://www.lanmon.net点击数:1492


垃圾回收
我们作为Python程序员很幸福。 我们日常之所以不太需要关注内存管理和垃圾收集,是因为CPython解释器有自己的机制进行处理。 那么,在Python的世界里,为什么不需要太关注垃圾回收呢?
这是因为Python独有的解释器会自动进行与垃圾回收相对应的处理,在大部分场景中不需要人为干扰。 另外,对Python的共识是开发效率。 因为是粘合剂语言,所以在很多情况下高性能和内存问题不明显,现在服务器资源便宜,人力资源高的情况下。
使用Python进行Web开发,即使工作多年也不怎么会遇到内存管理和垃圾回收。 在web  APP应用中大多数使用多进程模型,一种是定期超时重新启动,另一种是每次联机时都重新启动进程。 因此,一个进程长时间驻留,占用大量内存,不会引起内存泄漏。 因此,GC的缺陷几乎不会对Web开发产生大的影响。 并且CPython也很齐全,几乎不会发生内存泄漏之类的问题。 大多数情况下,开发人员使用不当或使用不当,导致内存消耗不正常。
参照数
因为Python的垃圾回收是基于引用技术的,所以理解引用计数也是非常重要的。 引用计数的原理是在创建或复制对象的引用时,将对对象的引用计数加1。 如果放弃一个对象的引用,则对象的引用数将减少1。 如果对象的引用数减少到0,则意味着该对象已经不被任何人使用,并且可以立即释放其使用的内存。
引用计数这一结构的特征比较具有实时性,但引用计数存在循环引用问题。 例如,如果a引用b,b引用a,每个对象的引用数不为0,则永远不会回收a和b消耗的内存资源。 因此,为了解决这个问题,需要一些回收算法,但是Python使用了标签清除和分代回收机制。
359 MP.weixin.QQ.com/s/kjm  4c  iz  8ms  96 r  3n9rt8m  9瓦
取消标记
如上所述,标记-清除是为了解决循环参照的问题。 理想地,例如,有两个对象a和b,并且如果a有b的参考,则b的参考数减1。 然后,沿着引用到达b。 因为b有引用a的引用,所以同样地将a的引用数减1。 这样,将通过参考计数循环参考的环摘出。但是,还有一个问题。 假设为对象a。 有对对象c的引用,c没有引用a。 如果c的参照计数减少1,最后a没有被回收的话,显然我们错把c的参照计数减少了1。 这样,在将来的某个期间内就会发生对c的悬空引用。 这要求在c未被删除的情况下对c的引用计数进行复用。 如果采用这样的方案,维持该参照计数的复杂性将倍增。 这个标记清除为了解决这个问题,采用了更好的方法。
由于清除标记后,可以复制集合中对象的引用数,而不是更改实际的引用数,因此采用了更好的方法。 对副本进行更改不会影响对象的生命周期的维持。
按世代回收
代理回收是面试中经常被问到的问题。 分代回收的核心思想是,对象生存的时间越长,就应该回收得越少,而不是垃圾。 另外,Python将所有对象分为0、1、2三代,所有新对象都是0代对象。 但是,如果某一代的对象经历了垃圾回收,依然生存,那就分为下一代的对象——第一代或第二代。

您可以使用以下代码查看按层代列出的预先值: 通常返回元组,包含三个数字。 默认值为[ 700,10,10 ]。 前一个数字700表示上次垃圾回收减去当前分配的内存数减去释放的内存数。 当这个数字达到700时,将回收第一代垃圾对象,并将第二个数字加1。 当第二个数字增加到10时,第一代和第二代垃圾对象被回收,第三个数字加1。 当第三个数值增加到10时,将回收三代,初始化为[ 0,0,0 ],然后继续计数。

文/上海蓝盟 IT外包专家

IT外包
>
400-635-8089
立即
咨询
电话咨询
服务热线
400-635-8089
微信咨询
微信咨询
微信咨询
公众号
公众号
公众号
返回顶部