Joe*_*oel 7 python garbage-collection memory-leaks
我正在尝试跟踪Python(2.7)中的内存泄漏.我找到了gc.get_referrers,但是不明白输出.删除后dying_node(除了我作为狩猎的一部分创建的列表之外,应删除所有引用),我的代码中有:
gc.collect()
print "done dying: ", getrefcount(dying_node) #note, includes the reference from getrefcount
referrers = gc.get_referrers(dying_node)
print "referrers: "
for referrer in referrers:
print referrer
Run Code Online (Sandbox Code Playgroud)
产生输出:
> done dying: 4
> referrers:
> [<__main__.Node instance at 0x104e53cb0>, <__main__.Node instance at 0x104e53b90>, <__main__.Node instance at 0x104e53b00>, <__main__.Node instance at 0x104e53d40>, <__main__.Node instance at 0x104e53ab8>, <__main__.Node instance at 0x104e53bd8>, <__main__.Node instance at 0x104e53a70>, <__main__.Node instance at 0x104e53c20>, <__main__.Node instance at 0x104e53c68>, <__main__.Node instance at 0x104e53b48>]
> [<__main__.Node instance at 0x104e53c20>, <__main__.Node instance at 0x104e53ab8>, <__main__.Node instance at 0x104e53c68>, <__main__.Node instance at 0x104e53a70>, <__main__.Node instance at 0x104e53cb0>, <__main__.Node instance at 0x104e53b00>, <__main__.Node instance at 0x104e53d40>, <__main__.Node instance at 0x104e53b90>, <__main__.Node instance at 0x104e53b48>, <__main__.Node instance at 0x104e53bd8>]
> <frame object at 0x104516300>
Run Code Online (Sandbox Code Playgroud)
我想这意味着我有两个Nodes 列表,它们引用了这个节点和一个框架对象.我假设框架对象是dying_node我正在看的名称.其中一个列表是我创建的列表,以帮助我进行狩猎.但有没有办法弄清楚其他列表会是什么?
好吧,所以答案是
def namestr(obj, namespace):
return [name for name in namespace if namespace[name] is obj]
Run Code Online (Sandbox Code Playgroud)
例子:
gc.collect() #make sure all garbage cleared before collecting referrers.
referrers = gc.get_referrers(object_of_interest)
for referrer in referrers:
print namestr(referrer, globals())
Run Code Online (Sandbox Code Playgroud)
或者如果是本地的:
print namestr(referrer, locals())
Run Code Online (Sandbox Code Playgroud)
这将打印类似的内容['referrer', 'name_Im_interested_in']。这'referrer'是因为我刚刚给它命名了。列表中的另一件事是我想要找到的。
我从这里的一个答案借用了这个。如果有人有更好的答案,请发布,我很乐意接受。