赞
踩
垃圾回收机制有三种,主要采用引用计数机制为主,标记-清除和分代回收机制为辅的策略。
其中,标记-清除机制用来解决计数引用带来的循环引用而无法释放内存的问题,分代回收机制是为提升垃圾回收的效率。
Python中的每个对象都有一个引用计数,每当对象被引用时,其引用计数就会增加;当引用被删除或超出作用域时,引用计数就会减少。当对象的引用计数降为0时,该对象就被认为是不再被需要的,Python的垃圾回收器就会将其内存回收。
然而,引用计数并不能解决循环引用的问题。例如,如果两个对象相互引用,那么即使这两个对象实际上不再被其他部分的代码所使用,它们的引用计数也永远不会降为0,因此无法被垃圾回收器回收。
为了解决循环引用的问题,Python的垃圾回收器还采用了分代收集的策略。Python将所有的对象按照它们的“年龄”分为几代,新创建的对象属于第 0代,当这些对象在一次垃圾回收周期中存活下来时,它们就会被移到下一代。随着对象在内存中存在的时间越来越长,它们会被移到更老的代。
在分代收集中,Python的垃圾回收器会优先回收那些属于较年轻代的对象,因为这些对象更可能是临时性的,不再被需要的。而对于较老的代,垃圾回收器会采用一种更加精细的策略来识别并回收不再被需要的对象。
除此之外,Python还提供了一个可选的循环垃圾回收器,用于检测并回收那些由于循环引用而无法通过引用计数回收的对象。这个循环垃圾回收器会在一定条件下被触发,以确保所有的不再被需要的对象都能被正确地回收。
所有的新建对象都是0代对象;
当某一代对象经历过垃圾回收,依然存活,就被归入下一代对象。
Python将所有的对象分为0,1,2三代。所有的新建对象都是0代对象。
垃圾回收启动时,一定会扫描所有的0代对象。如果0代经过一定次数垃圾回收,那么就启动对0代和1代的扫描清理。
当1代也经历了一定次数的垃圾回收后,那么会启动对0,1,2,即对所有对象进行扫描。
然而,标记-清除算法也有一些缺点:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。