Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 了解gc.get\u引用程序_Python_Memory Leaks_Garbage Collection - Fatal编程技术网

Python 了解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

我正在尝试跟踪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 "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
等作为你的狩猎列表,这样他们就不算推荐人了。