python中的内存泄漏诊断

python中的内存泄漏诊断,python,memory-leaks,objgraph,Python,Memory Leaks,Objgraph,我一直在尝试使用objgraph调试Coopr包中的内存泄漏: 我将它固定在一个\u SetContainer对象上,但似乎无法理解该对象为什么会持久存在于内存中。下面是objgraph的结果。show_refs: 如何查找循环引用,如何让垃圾收集器收集\u SetContainer实例 我以前认为类本身可能有一个自引用(上图中类右下方的元组)。但objgraph始终显示继承的类始终具有自引用元组。您可以看到一个非常简单的测试用例。它主要是根据objgraph的输出进行猜测,但该实例似乎处于一

我一直在尝试使用objgraph调试Coopr包中的内存泄漏:

我将它固定在一个
\u SetContainer
对象上,但似乎无法理解该对象为什么会持久存在于内存中。下面是objgraph的结果。show_refs:

如何查找循环引用,如何让垃圾收集器收集
\u SetContainer
实例


我以前认为类本身可能有一个自引用(上图中类右下方的元组)。但objgraph始终显示继承的类始终具有自引用元组。您可以看到一个非常简单的测试用例。

它主要是根据objgraph的输出进行猜测,但该实例似乎处于一个循环中,其类有一个
\uu del\uuu
。在这种情况下,对象在CPython中永远保持活动状态。请检查以下内容:

导入gc;gc.collect();打印垃圾垃圾垃圾


[,{'and':,…,'union':},(,,,,,,,,,,,]使用
pprint(gc.get\u referencets(obj.\u class\uuuuuu))
。自引用元组在那里,但是没有给出它的属性名。
print gc.garbage
返回一个空列表,但是
count=gc.collect()为非零。我相信这意味着存在无法收集的对象。此外,该方法(或其继承自)没有明确定义
\uuuuu del\uuuuu
方法。我收回第二条语句-我刚刚找到了继承的
\uuu del\uuuu
方法。否,gc.collect()返回已找到并收集的无法访问对象的数量。您可能遇到gc.collect()运行不够频繁的情况?(通常,它会不时自动运行。)尝试在程序运行时显式地调用gc.collect()。。。