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.分代回收

分代回收是用空间换时间,认为如果一个对象存活的时间越长越有可能不是垃圾,把那些在第一次垃圾回收后没有被清除的对象放入二代,减少标记清除检查的次数。一共分为三代。

posted @ 2020-01-11 10:59  不可思议的猪  阅读(1213)  评论(0编辑  收藏  举报