2015-11-04 8 views
5

मैं क्यों मेरे वस्तुओं में से एक किया जा रहा कचरा एकत्र नहीं है डिबग करने के लिए कोशिश कर रहा हूँ, और मैं प्रलेखन/पिछले प्रश्न के माध्यम से जाने की कोशिश कर रहा से कई प्रश्न हैं:कचरा संग्रहण

1) अगर मेरे ऑब्जेक्ट किसी भी संदर्भ चक्र में शामिल नहीं है, क्या मैं सही हूं कि कचरा संग्रह शामिल नहीं होता है, और यह कि पाइथन बस स्मृति को मुक्त करता है जब ऑब्जेक्ट की संदर्भ संख्या 0 तक गिर जाती है?

2) जब इस तरह के एक सरल वस्तु के संदर्भ गिनती 0 तक पहुँच जाता है, स्मृति तुरंत मुक्त कर दिया है, और यदि नहीं, इसके लिए मजबूर करने के लिए एक तरह से मुक्त किया जा रहा है?

3) अजगर sys.getrefcount (obj) का उपयोग कर रहा है संदर्भ में गिना जाता है का ट्रैक रखने के लिए?

4) क्यों नीचे कोड स्निपेट से 1 से 2 (यह प्रिंट 1 दोनों बार) सन्दर्भदाता की संख्या में वृद्धि नहीं करता है?

import gc 
a = [] 
print(len(gc.get_referrers(a)) 
b = a 
print(len(gc.get_referrers(a)) 
+0

https://medium.com/python-pandemonium/cpython-memory-management-479e6cd86c9 – codefire

उत्तर

2

1) हाँ, आप सही हैं। तुम भी जीसी निष्क्रिय कर सकते हैं यदि आप सुनिश्चित करें कि आपके कोड संदर्भ चक्र शामिल नहीं है कर रहे हैं: https://docs.python.org/2/library/gc.html

के बाद से कलेक्टर को पूरा करता है पहले से ही अजगर में इस्तेमाल किया संदर्भ गिनती, आप कलेक्टर निष्क्रिय कर सकते हैं यदि आप सुनिश्चित करें कि आपके हैं कार्यक्रम संदर्भ चक्र नहीं बनाता है। Gc.disable() को कॉल करके स्वचालित संग्रह अक्षम किया जा सकता है।

2) आप संग्रह चरण के लिए मजबूर करना चाहते हैं आप कर सकते हैं सरल कॉल collect

3) sys.getrefcount (obj) समारोह के पैरामीटर के सन्दर्भ में, यकीन नहीं अगर यह आपके प्रश्न का उत्तर भी शामिल

4) get_referrers की वापसी एक सरल सूची नहीं है, यह एक शब्दकोश अपने वस्तु के संदर्भ युक्त साथ एक सूची है।

[{'a': [], 'b': [], '__builtins__': <module '__builtin__' (built-in)>, '__file__': 'yourfile.py', '__package__': None, 'gc': <module 'gc' (built-in)>, 'x': {...}, '__name__': '__main__', '__doc__': None}] 

आप शब्दकोश में तत्व के रूप में अपनी वस्तु के सभी संदर्भ देख सकते हैं: पूर्ण वापसी मुद्रित करने के लिए आप की तरह कुछ होगा प्रयास करें।

+0

बिल्कुल सही! एकमात्र चीज जिसे मैं अभी भी स्पष्ट नहीं कर रहा हूं 2 और 3 है। यदि मेरे ऑब्जेक्ट में कोई संदर्भ चक्र नहीं है, तो संदर्भ गणना शून्य होने पर स्मृति को मुक्त कर देगा। 4. अब मुझे लगता है कि ख पाते हैं पर स्पष्टीकरण के लिए धन्यवाद = एक सन्दर्भदाता की गिनती बढ़ जाती है ... लेकिन मैं 10 वस्तुओं और फिर 11. तो जब प्रलेखन का कहना है कि स्मृति जब "संदर्भ गिनती" 0 चला जाता है मुक्त हो जाता है, उस संदर्भ गणना को पाने का सही तरीका क्या है? आखिरी सवाल यह है कि, क्या आप गारंटी देते हैं कि संदर्भ संख्या के साथ कोई ऑब्जेक्ट मुक्त हो जाएगा जैसे संदर्भ संख्या 0 तक गिर जाएगी? – Dan

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