2015-02-09 12 views
5

Python'da (2.7) bir bellek sızıntısı izlemeye çalışıyorum. gc.get_referrers'ı buldum, ancak çıkışı anlamıyorum. (Ben avcılık parçası olarak yarattık listesi için hariç tüm referansların kurtulmak olmalı) dying_node silindikten sonra, benim kodunda vardır:gc.get_referrers öğesini anlama

> 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> 
: çıkışını verir

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 

Sanırım bu, bu düğüme ve çerçeve nesnesine başvuran iki Node s listesi var demektir. Çerçeve nesnesinin baktığım dying_node adı olduğunu farz ediyorum. Listelerden biri avımda bana yardım etmek için yarattığım bir liste olacaktı. Ama diğer listenin ne olacağını anlamanın bir yolu var mı?

cevap

1

Pekala, o bir cevap

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

Örnek geçerli:

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

veya yerel eğer:

print namestr(referrer, locals()) 

Bu ['referrer', 'name_Im_interested_in'] gibi bir şey yazdırır. 'referrer', bunu daha önce isimlendirdiğim gerçeğinden kaynaklanıyor. Listedeki diğer şey bulmaya çalıştığım şey.

Bunu an answer here'dan ödünç aldım. Herhangi birinin daha iyi bir cevabı varsa, lütfen gönderin ve kabul etmekten mutluluk duyarız.