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