Python内存泄露问题

Posted 不可思议的猪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.分代回收

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

以上是关于Python内存泄露问题的主要内容,如果未能解决你的问题,请参考以下文章

使用gcobjgraph干掉python内存泄露与循环引用!

如何解决python训练数据内存泄露问题?

python性能优化内存优化内存泄露;与其他语音比较效率如何?

记一次调试python内存泄露的问题

python内存泄露的诊断(转)

关于排查python内存泄露的简单总结