7

कहानी:एक कार्यक्रम चलाने के दौरान पीढ़ी सूचियों देखना

Nina Zakharenko's PyCon talk अजगर में मेमोरी मैनेजमेंट पर के दौरान, वह जिस तरह से अजगर में पीढ़ीगत कचरा संग्रहण काम करता है यह देखते हुए बताते हैं कि:

अजगर कार्यक्रम के रूप में बनाए गए हर ऑब्जेक्ट की एक सूची बनाए रखी जाती है। वास्तव में, यह 3 बनाता है:

  • generation 0
  • generation 1
  • generation 2

प्रश्न:

अजगर में और के लिए मेमोरी मैनेजमेंट में और अधिक समझ हासिल करने के लिए मेमोरी लीक डीबग करने का उद्देश्य, प्रोग्राम चलाने के दौरान सभी 3 पीढ़ी सूचियों से कौन सी वस्तुओं को जोड़ा और हटाया जा सकता है, मैं कैसे देख सकता/सकती हूं?

मैंने gc module देखा है, लेकिन वर्तमान पीढ़ी सूचियों के मूल्य प्राप्त करने के लिए एक प्रासंगिक विधि नहीं मिली है।

+0

क्या आपका मतलब है 'gc.set_debug (झंडे ...)'? इस बिंदु पर –

+0

@ पैड्राइक कनिंघम, मुझे नहीं पता कि मेरा क्या मतलब है क्योंकि यह मेरे लिए बहुत नया है। मैंने डीबग मोड सेट करने की कोशिश नहीं की है .. मुझे देखें कि क्या यह पीढ़ी की सूचियों को देखने में मदद करता है। धन्यवाद! – alecxe

+0

@ पैड्राइक कनिंघम 'gc.set_debug()' डीबग आउटपुट संबंधित दिखता है, लेकिन यह अभी भी पीढ़ी की सूचियों में वस्तुओं की सूची प्रदान नहीं कर रहा है ..मूल रूप से, आदर्श रूप में, मैं देखना चाहता हूं कि सूचियों के अंदर कौन सी वस्तुएं हैं और कैसे प्रोग्राम निष्पादन के दौरान सूचियां बदलती हैं .. धन्यवाद। – alecxe

उत्तर

3

जैसा कि हमने टिप्पणियों में चर्चा की है, मुझे नहीं लगता कि पीढ़ी से सीधे पीढ़ी की सूचियों तक पहुंचने का कोई तरीका है, आप कुछ डीबग झंडे सेट कर सकते हैं, python2 में आप उन वस्तुओं की रिपोर्ट करने के लिए निम्नलिखित का उपयोग कर सकते हैं जो कर सकते हैं या नहीं कर सकते एकत्र किया:

import gc 

gc.set_debug(gc.DEBUG_UNCOLLECTABLE | gc.DEBUG_COLLECTABLE | gc.DEBUG_OBJECTS) 

python3, निम्नलिखित का उपयोग कर आप कुछ पीढ़ी उत्पादन और संग्रह और uncollectable वस्तुओं पर जानकारी दे देंगे:

import gc 

gc.set_debug(gc.DEBUG_UNCOLLECTABLE | gc.DEBUG_COLLECTABLE | gc.DEBUG_STATS) 

आप मिल उत्पादन की तरह:

gc: collecting generation 2... 
gc: objects in each generation: 265 4454 0 
gc: collectable <function 0x7fad67f77b70> 
gc: collectable <tuple 0x7fad67f6f710> 
gc: collectable <dict 0x7fad67f0e3c8> 
gc: collectable <type 0x285db78> 
gc: collectable <getset_descriptor 0x7fad67f095e8> 
gc: collectable <getset_descriptor 0x7fad67f09630> 
gc: collectable <tuple 0x7fad67f05b88> 
gc: done, 7 unreachable, 0 uncollectable, 0.0028s elapsed. 
gc: collecting generation 2... 

सेट होने पर gc.DEBUG_SAVEALLके अनुसार लीक के लिए, सभी पहुंचने योग्य वस्तुओं को मुक्त होने के बजाय कचरे में जोड़ा जाएगा। यह एक लीक कार्यक्रम डीबगिंग के लिए उपयोगी हो सकता है:

import gc 

gc.set_debug(gc.DEBUG_SAVEALL) 

python3 में, आप भी एक कॉलबैक कि चलाया जाता है जोड़ सकते हैं जब जीसी शुरू होता है और खत्म, एक सरल उदाहरण:

def f(phase, info): 
    if phase == "start": 
     print("starting garbage collection....") 
    else: 
     print("Finished garbage collection.... \n{}".format("".join(["{}: {}\n".format(*tup) for tup in info.items()]))) 

     print("Unreachable objects: \n{}".format(
      "\n".join([str(garb) for garb in gc.garbage]))) 
     print() 


gc.callbacks.append(f) 

gc.DEBUG_SAVEALL का मेल फ़ंक्शन के साथ आपको कोई पहुंच योग्य वस्तुएं दिखाई देगी, DEBUG_COLLECTABLE या DEBUG_LEAK को सेट करने के लिए बहुत अलग नहीं है, लेकिन callback जोड़ने का एक उदाहरण है।

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