python 内存泄漏、泄漏帧

标签 python memory-leaks

我有这段代码来获取函数的文件名、行号和函数的调用者。但它似乎正在泄漏帧,我不明白为什么。这是否只是让我感到厌烦,而我的泄漏一定在其他地方?

        rv = "(unknown file)", 0, "(unknown function)"

            for f in inspect.stack()[1:]:
                if __file__ in f:
                    continue
                else:
                    rv = f[1:4]
                    break

        return rv

我没有在任何地方保存对框架的引用。但肯定是帧泄漏了:

> objcallgraph.show_most_common_types()
>tuple                      24798
>frame                      9601
>...

Update: My frames are definitely being leaked. I did the suggestion about gc.set_debug() and frames are very slowly going into the gc.garbage list. Not even close to how many are being created though as show in show_most_common_types(). I have a question about scope though, in the above, doesn't f go out of scope after the for loop? Because I just tried this:


for f in range(20):
    l = 1

print f

它打印了 19。那么这可能是我的 for 循环中的 f 泄漏吗?这是我的 gc.garbage 列表中的框架引用的引用图:

alt text

更新2:

看起来检查模块本身保存着对框架的引用。这是来自事件帧的反向引用的对象图,而不是垃圾列表上的帧。

alt text

链接 here因为它太宽了。

有没有办法清除检查模块?这些帧到底保存在哪里=\

最佳答案

编辑我刚刚意识到这是错误的,f引用和f_back都指向相同的方向。我会把它留下,以防它激励其他人:

每个帧都有一个 f_back 指针,因此当您设置 f = inform.stack()[1] 时,inspect.stack()[0][0].f_locals code> (包含 f)现在具有对 ...stack()[1]...stack()[1][0].f_back 的引用指向 ...stack()[0][0]。因此,您创建了一个必须通过 GC 而不是简单地通过引用计数来解决的循环引用。 GC 未针对您的对象创建速率进行调整,因此您会消耗越来越多的内存。

您可以通过在退出函数时设置 f = None 来消除循环引用。这打破了循环引用。

关于python 内存泄漏、泄漏帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4093139/

相关文章:

python - os.environ.get() 为 Heroku 环境变量返回 None

c - 内存错误,不知道为什么会这样

python - keys 和 mget 不是原子的?

python - Scrapy:从不在同一目录中的项目导入包

python - 用户单击搜索按钮后尝试打印文本框的内容但没有打印 tkinter

C 复杂的内存泄漏

android - 我的 Android 应用程序泄漏,我应该检查什么?

java 内存泄漏 weblogic AES 弹力城堡

ios - Twitter 和 Fabric 中的内存泄漏 - Swift

python - Django:存储图像数据库