Python 了解gc.get\u引用程序
我正在尝试跟踪Python(2.7)中的内存泄漏。 我找到了gc.get\u引用程序,但不了解输出。删除Python 了解gc.get\u引用程序,python,memory-leaks,garbage-collection,Python,Memory Leaks,Garbage Collection,我正在尝试跟踪Python(2.7)中的内存泄漏。 我找到了gc.get\u引用程序,但不了解输出。删除死亡\u节点后(除了我在搜索过程中创建的列表外,应该删除所有引用),我的代码中有: gc.collect() print "done dying: ", getrefcount(dying_node) #note, includes the reference from getrefcount referrers = gc.get_referrers(dying_node) print "re
死亡\u节点
后(除了我在搜索过程中创建的列表外,应该删除所有引用),我的代码中有:
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
这将产生输出:
> 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>
>完成死亡:4
>推荐人:
> [, , , , , ]
> [, , , , , ]
>
我想这意味着我有两个
Node
s列表,它们引用了这个节点和一个frame对象。我假设frame对象就是我正在查看的名称垂死节点
。其中一个列表是我为帮助我打猎而创建的列表。但是有没有办法找出另一个列表呢?好的,答案是
def namestr(obj, namespace):
return [name for name in namespace if namespace[name] is obj]
例如:
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())
或者如果是本地的:
print namestr(referrer, locals())
这将打印类似于['referer','name\u Im\u interest\u']
的内容。'referer'
是因为我刚刚给它起了个名字。列表中的另一件事是我想找到的
我从他那里借的。如果有人有更好的答案,请发布,我很乐意接受。“或者如果是本地的”——如果是本地的?你怎么知道呢?如果
objectofinterest
是本地的(如果我没记错的话)。我不知道一个人是如何提前告知的,但我认为基于代码,这一点会很清楚。很长一段时间以来我都没有想到这一点,很明显,我当时不是专家,否则我就不会问这个问题了。使用weakref.WeakSet
等作为你的狩猎列表,这样他们就不算推荐人了。