2015-02-09 3 views
5

मैं पायथन (2.7) में मेमोरी लीक को ट्रैक करने का प्रयास कर रहा हूं। मुझे gc.get_referrers मिल गया है, लेकिन आउटपुट को समझ में नहीं आता है। dying_node (जो एक सूची है कि मैं अपने शिकार के हिस्से के रूप में बना लिया है के लिए छोड़कर सभी संदर्भों से छुटकारा पाने चाहिए) को हटाने के बाद, मैं अपने कोड में है:gc.get_referrers को समझना

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> 

मुझे लगता है कि इसका मतलब है कि मेरे पास Node एस की दो सूचियां हैं जो इस नोड और फ्रेम ऑब्जेक्ट को संदर्भित करती हैं। मुझे लगता है कि फ्रेम ऑब्जेक्ट नाम dying_node है जिसे मैं देख रहा हूं। सूचियों में से एक एक सूची होगी जो मैंने अपने शिकार में मेरी मदद करने के लिए बनाई है। लेकिन क्या यह पता लगाने का कोई तरीका है कि दूसरी सूची क्या होगी?

उत्तर

1

ठीक है, तो एक जवाब

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

यह ['referrer', 'name_Im_interested_in'] की तरह कुछ प्रिंट होगा। 'referrer' इस तथ्य के कारण है कि मैंने अभी इसे नाम दिया है। सूची में दूसरी चीज वह है जिसे मैं ढूंढने की कोशिश कर रहा हूं।

मैंने इसे an answer here से उधार लिया। अगर किसी के पास बेहतर जवाब है, तो कृपया इसे पोस्ट करें और मुझे इसे स्वीकार करने में खुशी होगी।

संबंधित मुद्दे