gpt4 book ai didi

python 内存泄漏、泄漏帧

转载 作者:行者123 更新时间:2023-12-01 06:14:23 24 4
gpt4 key购买 nike

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

        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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com