2009-04-21 15 views
21

एक ले-मैन शब्दावली में कचरा संग्रह तंत्र कैसे काम करता है?कचरा संग्रहण तंत्र कैसे काम करता है?

कचरा संग्रहण के लिए एक वस्तु को कैसे पहचानने के लिए पहचाना जाता है?

इसके अलावा, Reference Counting, Mark and Sweep, Copying, Train क्या जीसी एल्गोरिदम में है?

+4

नोप्स ... इसकी नहीं। शायद यह प्रतीत होता है कि मैं इसे इस तरह से रखता हूं। किसी भी तरह से –

+1

मैं पॉल आर विल्सन (1 99 2) द्वारा काफी अच्छे, 34-पेज सचित्र पेपर, [* यूनिप्रोसेसर कचरा संग्रहण तकनीक * पढ़ने की सिफारिश करता हूं] (http://www.cse.nd.edu/~dthain /courses/cse40243/spring2006/gc-survey.pdf), जो मूल कचरा संग्रहण तकनीकों (संदर्भ गिनती, मार्क-एंड-स्वीप, मार्क-कॉम्पैक्ट, वृद्धिशील, पीढ़ी) के पीछे अवधारणाओं को समझाता है। – stakx

उत्तर

29

जब आप कचरा संग्रह वाली भाषा का उपयोग करते हैं तो आपको सीधे स्मृति तक पहुंच नहीं मिलती है। इसके बजाय आपको उस डेटा के शीर्ष पर कुछ अमूर्तता तक पहुंच प्रदान की जाती है। उन चीजों में से एक जो उचित रूप से दूर है, डेटा ब्लॉक की स्मृति में वास्तविक स्थान है, साथ ही साथ अन्य डेटाबॉक्स के पॉइंटर्स भी हैं। जब कचरा कलेक्टर चलता है (यह कभी-कभी होता है) यह जांच करेगा कि क्या आप अभी भी आपके लिए आवंटित किए गए प्रत्येक मेमोरी ब्लॉक का संदर्भ रखते हैं या नहीं। यदि आप नहीं करते हैं तो यह उस स्मृति को मुक्त कर देगा।

विभिन्न प्रकार के कचरा कलेक्टरों के बीच मुख्य अंतर उनकी दक्षता के साथ-साथ किसी भी प्रकार की आवंटन योजनाओं को नियंत्रित करने के लिए कोई सीमाएं हैं।

सबसे सरल सही संदर्भ गणना है। जब भी आप किसी ऑब्जेक्ट का संदर्भ बनाते हैं तो उस ऑब्जेक्ट पर एक आंतरिक काउंटर बढ़ जाता है, जब आप संदर्भ का मौका देते हैं या यह अब दायरे में नहीं है, तो (पूर्व) लक्ष्य ऑब्जेक्ट पर काउंटर कम हो जाता है। जब यह काउंटर शून्य तक पहुंच जाता है, तो ऑब्जेक्ट अब बिल्कुल संदर्भित नहीं होता है और इसे मुक्त किया जा सकता है।

संदर्भ गिनती कलेक्टरों की गणना के साथ समस्या यह है कि वे परिपत्र डेटा से निपट नहीं सकते हैं। यदि ऑब्जेक्ट ए में ऑब्जेक्ट बी का संदर्भ है और इसके बदले में ऑब्जेक्ट ए के लिए कुछ (प्रत्यक्ष या अप्रत्यक्ष) संदर्भ है, तो उन्हें कभी भी मुक्त नहीं किया जा सकता है, भले ही श्रृंखला में किसी भी वस्तु को चेन के बाहर दोहराया न जाए (और इसलिए ' कार्यक्रम के लिए बिल्कुल सुलभ नहीं है)।

दूसरी तरफ मार्क और स्वीप एल्गोरिदम इसे संभाल सकता है। मार्क और स्वीप एल्गोरिदम प्रोग्राम के निष्पादन को समय-समय पर रोककर काम करता है, प्रत्येक आइटम को प्रोग्राम को पहुंचने योग्य के रूप में आवंटित किया गया है। कार्यक्रम तब कार्यक्रम के सभी चर के माध्यम से चलता है और जो वे पहुंचने योग्य के रूप में इंगित करते हैं उन्हें चिह्नित करता है। यदि इनमें से किसी भी आवंटन में प्रोग्राम में अन्य डेटा के संदर्भ शामिल हैं, तो डेटा को उसी तरह पहुंचने योग्य, आदि के रूप में चिह्नित किया जाता है।

यह एल्गोरिदम का चिह्न हिस्सा है। इस बिंदु पर सबकुछ प्रोग्राम तक पहुंच सकता है, इससे कोई फर्क नहीं पड़ता कि अप्रत्यक्ष रूप से, पहुंच योग्य के रूप में चिह्नित किया गया है और प्रोग्राम जो कुछ भी नहीं पहुंच सकता है उसे पहुंचने योग्य नहीं है। कचरा कलेक्टर अब पहुंचने योग्य वस्तुओं के साथ जुड़े स्मृति को सुरक्षित रूप से पुनः प्राप्त कर सकता है।

मार्क और स्वीप एल्गोरिदम के साथ समस्या यह है कि यह कुशल नहीं है - पूरे कार्यक्रम को इसे चलाने के लिए रोकना होगा, और ऑब्जेक्ट संदर्भों में से कई बदलाव नहीं होने जा रहे हैं।

इस पर सुधार करने के लिए, मार्क और स्वीप एल्गोरिदम को तथाकथित "जनरेशन कचरा संग्रह" के साथ बढ़ाया जा सकता है। इस मोड में ऑब्जेक्ट्स जो कुछ कचरे के संग्रह के लिए सिस्टम में हैं, पुरानी पीढ़ी को बढ़ावा दिया जाता है, जिसे अक्सर चेक नहीं किया जाता है।

यह दक्षता में सुधार करता है क्योंकि वस्तुएं युवाओं को मरती हैं (एक लूप के अंदर एक स्ट्रिंग बदलती है, जिसके परिणामस्वरूप शायद कुछ सौ चक्र का जीवनकाल होता है) या बहुत लंबा रहता है (वस्तुओं की मुख्य खिड़की का प्रतिनिधित्व करने के लिए उपयोग की जाने वाली वस्तुएं एप्लिकेशन, या सर्वलेट का डेटाबेस कनेक्शन)।

विकिपीडिया पर अधिक विस्तृत जानकारी मिल सकती है।

जोड़ा टिप्पणी के आधार पर:

निशान के साथ

और स्वीप एल्गोरिथ्म (और साथ ही संदर्भ गिनती को छोड़कर किसी भी अन्य कचरा संग्रहण एल्गोरिथ्म) कचरा संग्रहण, अपने कार्यक्रम के संदर्भ में नहीं रन कर के बाद से इसे सामान तक पहुंचने में सक्षम होना चाहिए कि आपका प्रोग्राम सीधे पहुंचने में सक्षम नहीं है। इसलिए यह कहना सही नहीं है कि कचरा कलेक्टर ढेर पर चलता है।

+3

साफ़, आसान और संक्षिप्त। यहां एक प्रश्न आपने मार्क और स्वीप के बारे में कहा है कि यह आपके प्रोग्राम पर सभी चरों की जांच करता है। अगर मैं ढेर में ढेर और वस्तु पर गलत संदर्भ नहीं हूं, तो हम उस जीसी प्रक्रिया को कैसे ढेर में जोड़ सकते हैं। –

3

कचरा संग्रह केवल यह जानना है कि आपके कार्यक्रम में चर के लिए कोई भविष्य की आवश्यकता है, और यदि नहीं, तो उन्हें एकत्र और हटाएं।

जोर शब्द कचरा, कुछ है कि पूरी तरह से अपने घर में बाहर का इस्तेमाल किया कचरे में फेंक दिया जाता है और कचरा आदमी यह ले सकते हैं और इसे दूर ले करने के लिए आने से यह तुम्हारे लिए संभालती है आप और अधिक कमरे देने के लिए पर है आपके घर में कचरा कर सकते हैं।

संदर्भ गिनती, मार्क और स्वीप, प्रतिलिपि बनाई जा रही, ट्रेन आदि GC FAQ

4
  • संदर्भ गिनती में अच्छा विस्तार से चर्चा कर रहे हैं - प्रत्येक वस्तु गिनती जो वृद्धि की जाती है जब किसी के लिए एक संदर्भ लेता है ऑब्जेक्ट, और कमी जब संदर्भ जारी करता है। जब संदर्भ गणना शून्य पर जाती है, तो वस्तु हटा दी जाती है। COM इस दृष्टिकोण को का उपयोग करता है।
  • मार्क और स्वीप - प्रत्येक ऑब्जेक्ट में इसका उपयोग ध्वज है यदि यह उपयोग में है। ऑब्जेक्ट ग्राफ़ (ग्लोबल वैरिएबल, स्टैक्स पर स्थानीय, इत्यादि) की जड़ से शुरू होने पर प्रत्येक संदर्भित ऑब्जेक्ट को इसका ध्वज सेट मिलता है, और इसलिए श्रृंखला के नीचे। अंत में, ग्राफ में संदर्भित सभी ऑब्जेक्ट्स हटा दिए जाते हैं।

सीएलआर के लिए कचरा कलेक्टर इस slidedeck में वर्णित है। स्लाइड 15 पर "रूट्स" उन वस्तुओं के स्रोत हैं जो पहले ग्राफ में जाते हैं। उनके सदस्य फ़ील्ड और इतने पर ग्राफ में अन्य ऑब्जेक्ट्स को खोजने के लिए उपयोग किया जाता है।

Wikipedia इन दृष्टिकोणों में से कई और बेहतर विवरणों का वर्णन करता है।

+0

मैं विकिपीडिया के माध्यम से चला गया हूं .. असल में मुझे परेशान करने वाली चीज ऑब्जेक्ट ग्राफ़ है जिसे यह कैसे बनाए रखा जाता है और जीसी रूटीन द्वारा ट्रैवर किया जाता है। –

+0

ऑब्जेक्ट ग्राफ़ के निर्माण के 10k दृश्य के साथ मेरा उत्तर अपडेट किया गया। – Michael

0

सामान्य तरीके से यह किया जाता है कि किसी ऑब्जेक्ट के संदर्भों की संख्या पृष्ठभूमि में ट्रैक रखी जाती है, और जब यह संख्या शून्य हो जाती है, तो ऑब्जेक्ट कचरा संग्रहण के अधीन होता है, हालांकि जीसी आग नहीं लगाएगा जब तक इसकी स्पष्ट रूप से आवश्यकता नहीं होती है क्योंकि यह एक महंगा ऑपरेशन है। जब यह शुरू होता है तो क्या होता है कि जीसी स्मृति के प्रबंधित क्षेत्र के माध्यम से जाता है और प्रत्येक ऑब्जेक्ट को पाता है जिसमें कोई संदर्भ नहीं छोड़ा जाता है। जीसी उन वस्तुओं को पहले अपने विनाशकों को बुलाकर हटा देता है, जिससे उन्हें खुद को साफ करने की इजाजत मिलती है, फिर स्मृति को मुक्त कर दिया जाता है। आम तौर पर जीसी प्रत्येक जीवित वस्तु को स्मृति के एक क्षेत्र में ले जाकर प्रबंधित स्मृति क्षेत्र को कॉम्पैक्ट करेगा, जिससे अधिक आवंटन हो सकेगा।

जैसा कि मैंने कहा था कि यह एक तरीका है जिसे मैं जानता हूं, और इस क्षेत्र में बहुत सारे शोध किए जा रहे हैं।

0

Garbage collection एक बड़ा विषय है, और इसे लागू करने के कई तरीके हैं।

लेकिन संक्षेप में सबसे आम के लिए, कचरा कलेक्टर new ऑपरेटर के माध्यम से बनाया कुछ भी करने के लिए सभी संदर्भों का एक रिकार्ड (उदाहरण के लिए एक Type.Create() विधि में,) रहता है, भले ही है कि ऑपरेटर के उपयोग आप से छिपा हुआ था। प्रत्येक बार जब आप ऑब्जेक्ट में नया संदर्भ जोड़ते हैं, तो उस संदर्भ के रूट को निर्धारित किया जाता है और यदि आवश्यक हो, तो सूची में जोड़ा जाता है। जब भी यह दायरे से बाहर हो जाता है तो एक संदर्भ हटा दिया जाता है।

जब किसी ऑब्जेक्ट का कोई और संदर्भ नहीं होता है, तो यह (नहीं "होगा") एकत्र किया जा सकता है। प्रदर्शन में सुधार करने के लिए और सुनिश्चित करें कि आवश्यक सफाई सही तरीके से की जाती है, संग्रह कई वस्तुओं के लिए एक बार में बैच किया जाता है और कई पीढ़ियों में होता है।

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