Python 2.6 GC出现清理对象,但内存并未释放

标签 python memory memory-leaks

我有一个用 python 2.6 编写的程序,它创建了大量短暂的实例(这是一个典型的生产者-消费者问题)。我注意到 top 和 pmap 报告的内存使用情况似乎在创建这些实例时增加并且永远不会下降。我担心我正在使用的某些 python 模块可能会泄漏内存,所以我小心地将问题隔离在我的代码中。然后我开始以尽可能短的示例重现它。我想到了这个:

class LeaksMemory(list):
    timesDelCalled = 0

    def __del__(self):
        LeaksMemory.timesDelCalled +=1


def leakSomeMemory():
    l = []
    for i in range(0,500000):
        ml = LeaksMemory()
        ml.append(float(i))
        ml.append(float(i*2))
        ml.append(float(i*3))
        l.append(ml)

import gc
import os


leakSomeMemory()

print("__del__ was called " + str(LeaksMemory.timesDelCalled) + " times")
print(str(gc.collect())  +" objects collected")
print("__del__ was called " + str(LeaksMemory.timesDelCalled) + " times")
print(str(os.getpid()) + " : check memory usage with pmap or top")

如果您使用诸如“python2.6 -i memoryleak.py”之类的东西运行它,它将停止,您可以使用 pmap -x PID 来检查内存使用情况。我添加了 del 方法,这样我就可以验证 GC 是否正在发生。它不存在于我的实际程序中,并且似乎没有任何功能差异。每次调用 leakSomeMemory() 都会增加该程序消耗的内存量。我担心我犯了一些简单的错误并且引用被意外保留,但无法识别它。

最佳答案

Python 会释放对象,但不会立即将内存释放回操作系统。相反,它将在同一解释器内重新使用相同的段进行 future 分配。

这是一篇关于该问题的博文:http://effbot.org/pyfaq/why-doesnt-python-release-the-memory-when-i-delete-a-large-object.htm

更新:我自己用 Python 2.6.4 对此进行了测试,没有注意到内存使用量持续增加。 leakSomeMemory() 的一些调用导致 Python 进程的内存占用量增加,而一些则使其再次减少。所以这完全取决于分配器如何重新使用内存。

关于Python 2.6 GC出现清理对象,但内存并未释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4949335/

相关文章:

python - 为什么 sklearn 训练/测试分割加上 PCA 会使我的标签不正确?

python - Proxifier 打开时 Python IDLE 和 shell 中出现错误

iphone - iPhone 内存泄漏问题

ios - 3 我不确定的泄漏?

ios - 自定义类的 Objective-C 多重嵌套 initWith

java - 以下场景在 Java 中是否称为内存泄漏?不是垃圾收集吗?

python - 为什么形状不会在屏幕上移动?

c - x64 与 x86 中的内存处理 - C 语言

javascript weakmap 保留对已删除对象的引用

python - BeautifulSoup - 属性错误: 'NavigableString' object has no attribute 'find_all'