python的垃圾回收机制
原理:
当一个对象的引用被创建或者复制时,对象的引用计数加1;
当一个对象的引用被销毁时,对象的引用计数减1,
当对象的引用计数减少为0时,就意味着对象已经再没有被使用了,
可以将其内存释放掉。
优点:引用计数有一个很大的优点,即实时性,任何内存,一旦没有指向它的引用,
就会被立即回收,而其他的垃圾收集技术必须在某种特殊条件下才能进行无效内存的回收。
缺点:引用技术存在一个很大的问题-循环引用,因为对象之间相互引用,每个对象的引用都不会为0,
所以这些对象所占用的内存始终都不会被释放掉。
标记清除
标记-清除只关注那些可能会产生循环引用的对象
缺点 标记和清除的过程效率不高
分代回收:
将系统中的所有内存块根据其存活时间划分为不同的集合,每一个集合就成为一个“代”,
Python默认定义了三代对象集合,垃圾收集的频率随着“代”的存活时间的增大而减小。
也就是说,活得越长的对象,就越不可能是垃圾,就应该减少对它的垃圾收集频率。
那么如何来衡量这个存活时间:通常是利用几次垃圾收集动作来衡量,
如果一个对象经过的垃圾收集次数越多,可以得出:该对象存活时间就越长
1、当内存中有不再使用的部分时,垃圾收集器就会把他们清理掉。它会去检查那些引用计数为0的对象,
然后清除其在内存的空间。当然除了引用计数为0的会被清除,
还有一种情况也会被垃圾收集器清掉:当两个对象相互引用时,他们本身其他的引用已经为0了。
2、垃圾回收机制还有一个循环垃圾回收器, 确保释放循环引用对象(a引用b, b引用a, 导致其引用计数永远不为0)。