Python内存泄露问题
什么是内存泄露?
内存泄露是那些使用过后,应该被清理却没有被清理的内存一直占据着系统资源,通过长时间的累积导致系统崩溃。
Python的垃圾回收机制
1、引用计数
原理:当一个对象的引用被创建或者复制时,对象的引用计数+1,当一个对象的引用被销毁时,对象的引用计数-1,当对象的引用计数变为0时,就意味着已经没有再被使用了,可以将其内存释放掉。
优点:引用计数的优点是实时性,任何对象只要没有被引用就会被释放。
缺点:1.维护引用计数需要额外的操作,花费时间和空间。2.引用计数无法解决循环引用问题,当两个对象互相引用对方时,每个对象的计数都不是0,这些对象永远不会被引用计数机制回收。
2、标记-清除
标记清除只关注那些可能会产生循环引用的对象,一般都是容器对象,比如列表、字典、类等等。
过程:
1.当触发标记清除机制时,首先将所有对象及引用计数复制出一份副本,对副本进行以下操作
2.假设AB互相引用对方,遍历每个对象,如A,如果A中引用了B,则先将B的引用计数-1,然后去看B,如果B引用了A,则将A的引用计数也-1,这样就将对象的真实有效引用数暴露了出来。
3.遍历完成后,如果有效引用为0则说明需要回收。
缺点:效率低
3.分代回收
分代回收是用空间换时间,认为如果一个对象存活的时间越长越有可能不是垃圾,把那些在第一次垃圾回收后没有被清除的对象放入二代,减少标记清除检查的次数。一共分为三代。