本文介绍了了解gc.get_referrers的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图跟踪Python中的内存泄漏(2.7)。
我找到了gc.get_referrers,但不理解输出。在删除 dying_node (除了我创建的列表作为我的狩猎的一部分之外,应该除去所有引用)之后,我在代码中:

  gc.collect()
printdone dying:,getrefcount(dying_node)#note,包含getrefcount的引用
referrers = gc.get_referrers(dying_node)
printreferrers:
for referrer in referrers:
print referrer

可以产生输出:

 >完成临死:4 
>推荐人:
> [< __main __。0x104e53cb0>节点实例,< __main__。0x104e53b90节点实例>,__main__。0x104e53b00节点实例>,__main__节点实例0x104e53d40>,__main__节点实例0x104e53ab8> ,< __main__,0x104e53bd8>节点实例,< __main__; 0x104e53a70节点实例>,__main__。0x104e53c20节点实例,< __main__。0x104e53c68>节点实例,< __main__节点实例0x104e53b48> ]
> [< __main __。0x104e53c20>节点实例,< __main__。0x104e53ab8>节点实例,< __main__。0x104e53c68>节点实例,< __main__节点实例,0x104e53a70>,___main__节点实例在0x104e53cb0> ,< __main__,0x104e53b00>,< __main__的节点实例,0x104e53d40>的节点实例,< __main__。,0x104e53b90>的节点实例,< __main__; 0x104e53b48>的节点实例,< __main__。 ]
> <在0x104516300处的框架对象>

我想这意味着我有两个 Node dying_node 。其中一份名单将成为我创造的一份清单,以帮助我狩猎。但有没有办法找出其他列表是什么?

解决方案

好的,所以答案是

  def namestr(obj,namespace):
return [名称空间[名称]为obj时,名称空间中的名称]

示例:

  gc.collect()#确保在收集引用者之前清除所有垃圾。 
referrers = gc.get_referrers(object_of_interest)
作为推荐人中的推荐人:
print namestr(referrer,globals())

或者它是本地的:

  print namestr(referrer,locals() )

这会打印出类似于 ['referrer','name_Im_interested_in'] 'referrer'是因为我刚刚命名它。在列表中的另一件事是我试图找到。



我从。如果有人有更好的答案,请张贴它,我会很乐意接受它。


I'm trying to track a memory leak in Python (2.7).I've found gc.get_referrers, but don't understand the output. After deleting dying_node (which should get rid of all references except for a list that I've created as part of my hunting), I have in my code:

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

which yields the output:

> 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>

I think this means I have two lists of Nodes which refer to this node and a frame object. I assume the frame object is the name dying_node that I'm looking at. One of the lists would be a list I've created to help me in my hunting. But is there a way to figure out what the other list would be?

解决方案

Alright, so an answer is

def namestr(obj, namespace):
    return [name for name in namespace if namespace[name] is obj]

Example:

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())

or if it's local:

    print namestr(referrer, locals())

This will print something like ['referrer', 'name_Im_interested_in']. The 'referrer' is because of the fact I've just named it that. The other thing in the list is what I'm trying to find.

I borrowed this from an answer here. If anyone has a better answer, please post it and I'll be happy to accept it.

这篇关于了解gc.get_referrers的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-24 01:26