गार्बेज संग्रह (कंप्यूटर विज्ञान)

अभिकलित्र विज्ञान में, कचरा संग्रह (जीसी) स्वत: मेमोरी प्रबंधन का रूप है। कचरा संग्राहक मेमोरी को पुनः प्राप्त करने का प्रयास करता है जिसे कार्यक्रम द्वारा आवंटित किया गया था, लेकिन अब इसका संदर्भ नहीं दिया गया है, ऐसी मेमोरी को 'कचरा (अभिकलित्र विज्ञान)' कहा जाता है।कचरा संग्रह का आविष्कार अमेरिकी अभिकलित्र वैज्ञानिक जॉन मैकार्थी (अभिकलित्र वैज्ञानिक) ने 1959 के आसपास लिस्प में हस्तचालित मेमोरी प्रबंधन को आसान बनाने के लिए किया था।

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

मेमोरी के अतिरिक्त अन्य संसाधन, जैसे नेटवर्क सॉकेट, डेटाबेस हैंडल (कंप्यूटिंग), विंडो (कम्प्यूटिंग), फ़ाइल (कंप्यूटिंग) विवरणक, सामान्यतः कचरा संग्रह द्वारा नियंत्रित नहीं होते हैं, बल्कि अन्य तरीकों (जैसे विनाशक) द्वारा नियंत्रित होते हैं। ऐसे ही कुछ तरीके मेमोरी को डी-आवंटित भी करते हैं।

सिंहावलोकन
कई प्रोग्रामिंग भाषाओं को कचरा संग्रह, या तो भाषा विनिर्देश के हिस्से के रूप में (उदाहरण के लिए, आरपीएल (प्रोग्रामिंग भाषा), जावा (प्रोग्रामिंग भाषा), सी शार्प (प्रोग्रामिंग भाषा) | सी #, डी (प्रोग्रामिंग भाषा), और अधिकांश स्क्रिप्टिंग भाषाएं) या प्रभावी रूप से व्यावहारिक कार्यान्वयन के लिए (उदाहरण के लिए, लैम्ब्डा कैलकुलस जैसी औपचारिक भाषाएं) की आवश्यकता होती है। इन्हें कचरा-संग्रहित भाषाएँ कहा जाता है। अन्य भाषाएँ, जैसे कि सी (प्रोग्रामिंग भाषा) और सी ++,को हस्तचालित मेमोरी प्रबंधन के साथ प्रयोग के लिए डिजाइन किया गया था, लेकिन इनमें कचरा-एकत्रित कार्यान्वयन उपलब्ध हैं। कुछ भाषाएँ, जैसे एडीए (प्रोग्रामिंग लैंग्वेज), मॉड्यूल -3, और सी ++/सीएलआई, एकत्र और हस्तचालित रूप से प्रबंधित वस्तुओं के लिए अलग-अलग ढेर का उपयोग करके कचरा संग्रह और हस्तचालित मेमोरी प्रबंधन दोनों को एक ही अनुप्रयोग में सह-अस्तित्व की अनुमति देती हैं। अभी भी अन्य, जैसे डी, कचरा-संग्रहित हैं, लेकिन उपयोगकर्ता को वस्तुओं को हस्तचालित रूप से हटाने या गति की आवश्यकता होने पर पूरी तरह से कचरा संग्रह को अक्षम करने की अनुमति देता है।

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

लाभ
जीसी प्रोग्रामर को हस्तचालित रूप से मेमोरी डी-आवंटन से मुक्त करता है। यह कुछ प्रकार की त्रुटियों से बचने में मदद करता है:


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

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

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

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

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

हस्तचालित मेमोरी प्रबंधन के साथ, और कचरा संग्रह का पता लगाने के विपरीत, संदर्भ गिनती गारंटी देती है कि जैसे ही उनका अंतिम संदर्भ नष्ट हो जाता है, वस्तुओं को नष्ट कर दिया जाता है, और सामान्यतः केवल मेमोरी तक पहुंच होती है जो या तो सीपीयू कैशमें होती है, मुक्त होने वाली वस्तुओं में, या सीधे इंगित की जाती है उनके द्वारा, और इस प्रकार सीपीयू कैश औरअप्रत्यक्ष स्मृतिऑपरेशन पर महत्वपूर्ण नकारात्मक दुष्प्रभाव नहीं होते हैं।

रेफरेंस काउंटिंग के कई नुकसान हैं, इसे सामान्यतः अधिक परिष्कृत एल्गोरिदम द्वारा हल या कम किया जा सकता है:


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


 * स्पेस ओवरहेड (रेफरेंस काउंट): रेफरेंस काउंटिंग के लिए प्रत्येक ऑब्जेक्ट को उसकी रेफरेंस काउंट को स्टोर करने के लिए स्पेस आवंटित करने की आवश्यकता होती है। काउंट को ऑब्जेक्ट की मेमोरी के पास या साइड टेबल में कहीं और स्टोर किया जा सकता है, लेकिन किसी भी स्थिति में, हर एक रेफरेंस-काउंटेड ऑब्जेक्ट को इसके रेफरेंस काउंट के लिए अतिरिक्त स्टोरेज की आवश्यकता होती है। एक अहस्ताक्षरित सूचक के आकार के साथ मेमोरी स्पेस सामान्यतः इस कार्य के लिए उपयोग किया जाता है, जिसका अर्थ है कि प्रत्येक वस्तु के लिए 32 या 64 बिट संदर्भ गणना भंडारण आवंटित किया जाना चाहिए। कुछ प्रणालियों पर, ऑब्जेक्ट की मेमोरी के अप्रयुक्त क्षेत्रों में संदर्भ गणना को संग्रहीत करने के लिए टैग किए गए सूचकका उपयोग करके इस ओवरहेड को कम करना संभव हो सकता है। अधिकांशतः, एक आर्किटेक्चर वास्तव में प्रोग्राम को मेमोरी पतों की पूरी श्रृंखला तक पहुंचने की अनुमति नहीं देता है जो उसके मूल सूचक आकार में संग्रहीत किया जा सकता है, पते में कुछ उच्च बिट्स को या तो अनदेखा किया जाता है या शून्य होना आवश्यक है। यदि किसी वस्तु के पास एक निश्चित स्थान पर एक सूचक है, तो संदर्भ संख्या को सूचक के अप्रयुक्त बिट्स में संग्रहीत किया जा सकता है। उदाहरण के लिए, ऑब्जेक्टिव-सीमें प्रत्येक वस्तु की मेमोरी की शुरुआत में उसकी कक्षा के लिए एक सूचक होता है, IOS 7 का उपयोग करते हुए ARM64आर्किटेक्चर पर, इस क्लास पॉइंटर के 19 अप्रयुक्त बिट्स का उपयोग ऑब्जेक्ट की रेफरेंस काउंट को स्टोर करने के लिए किया जाता है।


 * स्पीड ओवरहेड (वृद्धि/कमी): भोले-भाले कार्यान्वयन में, संदर्भ के प्रत्येक असाइनमेंट और दायरे से बाहर होने वाले प्रत्येक संदर्भ में अधिकांशतः एक या अधिक संदर्भ काउंटरों के संशोधन की आवश्यकता होती है। चूंकि, एक सामान्य मामले में जब किसी बाहरी दायरे के चर से एक आंतरिक दायरे के चर में एक संदर्भ की नकल की जाती है, जैसे कि आंतरिक चर का जीवनकाल बाहरी के जीवनकाल से घिरा होता है, तो संदर्भ वृद्धि को समाप्त किया जा सकता है। बाहरी चर "स्वामित्व" संदर्भ। प्रोग्रामिंग भाषा सी ++ में, इस तकनीक को  संदर्भों के उपयोग के साथ आसानी से कार्यान्वित और प्रदर्शित किया जाता है। सी ++ में संदर्भ गणना सामान्यतः स्मार्ट सूचक का उपयोग करके कार्यान्वित की जाती है जिनके निर्माता, विनाशक और असाइनमेंट ऑपरेटर संदर्भों का प्रबंधन करते हैं। एक स्मार्ट पॉइंटर को एक फ़ंक्शन के संदर्भ में पास किया जा सकता है, जो एक नए स्मार्ट पॉइंटर को कॉपी-निर्माण करने की आवश्यकता से बचा जाता है (जो फ़ंक्शन में प्रवेश पर संदर्भ संख्या को बढ़ाएगा और बाहर निकलने पर इसे कम करेगा)। इसकेअतिरिक्त फ़ंक्शन स्मार्ट पॉइंटर का संदर्भ प्राप्त करता है जो सस्ते में निर्मित होता है। संदर्भ गणना की Deutsch-बॉब्रो विधि इस तथ्य पर निर्भर करती है कि अधिकांश संदर्भ गणना अद्यतन वास्तव में स्थानीय चरों में संग्रहीत संदर्भों द्वारा उत्पन्न होते हैं। यह इन संदर्भों को अनदेखा करता है, केवल हीप में संदर्भों की गिनती करता है, लेकिन इससे पहले कि संदर्भ संख्या शून्य के साथ किसी वस्तु को हटाया जा सके, प्रणाली को स्टैक के स्कैन के साथ सत्यापित करना चाहिए और यह दर्ज करना चाहिए कि इसके लिए कोई अन्य संदर्भ अभी भी सम्मलित नहीं है। लेवानोनी और एरेज़ पेट्रैंकद्वारा पेश किए गए अपडेट कोलेसिंग द्वारा काउंटर अपडेट पर ओवरहेड में एक और पर्याप्त कमी प्राप्त की जा सकती है।  एक सूचक पर विचार करें कि निष्पादन के दिए गए अंतराल में कई बार अद्यतन किया जाता है। यह पहले एक वस्तु  ,की ओर इशारा करता है, फिर एक वस्तु  ,की ओर, और आगे भी अंतराल के अंत तक यह किसी वस्तु की ओर इशारा करता है। एक संदर्भ गिनती एल्गोरिथ्म आमतौर पर,  ,  ,  ,  , ...,  निष्पादित करेगा। लेकिन इनमें से अधिकतर अद्यतन बेमानी हैं। अंतराल के अंत में संदर्भ संख्या का उचित मूल्यांकन करने के लिए यह  तथा  . करने के लिए पर्याप्त है। लेवानोनी और पेट्रैंक ने विशिष्ट जावा बेंचमार्क में 99% से अधिक काउंटर अपडेट के उन्मूलन को मापा।


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


 * रीयल-टाइम नहीं: रेफरेंस काउंटिंग के भोले-भाले कार्यान्वयन सामान्यतः रीयल-टाइम व्यवहार प्रदान नहीं करते हैं, क्योंकि कोई भी पॉइंटर असाइनमेंट संभावित रूप से कुल आबंटित मेमोरी साइज से बंधी हुई कई वस्तुओं को पुनरावर्ती रूप से मुक्त कर सकता है, जबकि थ्रेड अन्य कार्य करने में असमर्थ है। अतिरिक्त ओवरहेड की कीमत पर, अन्य थ्रेड्स के लिए अप्रतिबंधित वस्तुओं को मुक्त करके इस मुद्दे से बचना संभव है।

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

उपलब्धता
सामान्यतया, उच्च-स्तरीय प्रोग्रामिंग भाषाओं में एक मानक विशेषता के रूप में कचरा संग्रह होने की संभावना अधिक होती है। कुछ भाषाओं में, जिनमें बिल्ट इन कचरा कलेक्शन नहीं है, इसे लाइब्रेरी के माध्यम से जोड़ा जा सकता है, जैसे कि C और C++ के लिए Boehm कचरा कलेक्टर के साथ।

एमएल (प्रोग्रामिंग भाषा), हास्केल (प्रोग्रामिंग भाषा), और एपीएल (प्रोग्रामिंग भाषा), अधिकांश कार्यात्मक प्रोग्रामिंग भाषाएं, में कचरा संग्रहण अंतर्निहित है। लिस्प पहली कार्यात्मक प्रोग्रामिंग भाषा और कचरा संग्रह शुरू करने वाली पहली भाषा दोनों के रूप में विशेष रूप से उल्लेखनीय है।

अन्य गतिशील भाषाएं, जैसे रूबी (प्रोग्रामिंग भाषा) और जूलिया (प्रोग्रामिंग भाषा) (लेकिन संस्करण 5.3 से पहले पर्ल 5 या PHP नहीं, जो दोनों संदर्भ गिनती का उपयोग करते हैं),जावास्क्रिप्ट]]और ईसीएमएस्क्रिप्ट भी जीसी का उपयोग करते हैं। वस्तु उन्मुख कार्यकर्मप्रोग्रामिंग लैंग्वेज जैसे स्मॉलटाक, आरपीएल और जावा सामान्यतः एकीकृत कचरा संग्रह प्रदान करते हैं। उल्लेखनीय अपवाद सी ++ और डेल्फी हैं, जिनमें विनाशक हैं।

बुनियादी
बेसिक और लोगो (प्रोग्रामिंग भाषा)ने अधिकांशतः चर-लंबाई वाले डेटा प्रकारों, जैसे स्ट्रिंग्स और सूचियों के लिए कचरा संग्रह का उपयोग किया है, जिससे कि मेमोरी प्रबंधन विवरण के साथ प्रोग्रामर को बोझ न किया जा सके। अल्टेयर 8800 पर, कई स्ट्रिंग वेरिएबल्स और कम स्ट्रिंग स्पेस वाले प्रोग्राम कचरा संग्रहण के कारण लंबे समय तक रुके रह सकते हैं। इसी तरह Applesoft BASIC दुभाषिया का कचरा संग्रह एल्गोरिथ्म बार-बार स्ट्रिंग विवरणक को उच्चतम पते वाले स्ट्रिंग के लिए स्कैन करता है जिससे कि इसे उच्च मेमोरी की ओर कॉम्पैक्ट किया जा सके, जिसके परिणामस्वरूप $$O(n^2)$$प्रदर्शन और कुछ सेकंड से लेकर कुछ मिनटों तक कहीं भी रुक जाता है। रैंडी विगगिंटनद्वारा एपलसॉफ्ट बेसिक के लिए एक प्रतिस्थापन कचरा संग्राहक ढेर के ऊपर से प्रत्येक पास में तारों के एक समूह की पहचान करता है, संग्रह समय को नाटकीय रूप से कम करता है। BASIC.System, 1983 में ProDOS के साथ जारी किया गया, BASIC के लिए एक विंडोिंग कचरा संग्रहकर्ता प्रदान करता है जो कई गुना तेज है।

उद्देश्य-सी
जबकि ऑब्जेक्टिव-सी में परंपरागत रूप से कोई कचरा संग्रह नहीं था, 2007 में ओएस एक्स 10.5 के रिलीज के साथ ऐप्पल ने इन-हाउस विकसित अर्थगत कलेक्टर का उपयोग करके ऑब्जेक्टिव-सी 2.0 के लिए कचरा संग्रह पेश किया। चूंकि, 2012 में ओएस एक्स 10.8 की रिलीज के साथ, कचरा संग्रह को एलएलवीएमके स्वचालित संदर्भ काउंटर (एआरसी) के पक्ष में बहिष्कृत कर दिया गया था जिसे ओएस एक्स 10.7 के साथ पेश किया गया था। इसके अतिरिक्त, मई 2015 से ऐप्पल ने ऐप स्टोर (आईओएस)में नए ओएस एक्स अनुप्रयोगों के लिए कचरा संग्रह के उपयोग को भी प्रतिबंधित कर दिया है। आईओएस के लिए, आवेदन प्रतिक्रिया और प्रदर्शन में समस्याओं के कारण कचरा संग्रह कभी भी पेश नहीं किया गया है,  इसकेअतिरिक्त, आईओएस एआरसी का उपयोग करता है।

सीमित वातावरण
सीमित संसाधनों के उपयोग पर बहुत कड़े नियंत्रण की सामान्य आवश्यकता के कारण कचरा संग्रह शायद ही कभी एम्बेडेड कंप्यूटिंग या रीयल-टाइम प्रणाली पर उपयोग किया जाता है। चूंकि, कई सीमित वातावरणों के अनुकूल कूड़ा उठाने वाले संग्राहक विकसित किए गए हैं। Microsoft .NET माइक्रो फ्रेमवर्क, .NET nanoFramework[32] और Java Platform, Micro Edition एम्बेडेड सॉफ़्टवेयर प्लेटफ़ॉर्म हैं, जिनमें उनके बड़े भाई-बहनों की तरह, कचरा संग्रहण सम्मलित है।

जावा
Java JDKs में उपलब्ध कचरा संग्राहकों में सम्मलित हैं:
 * कचरा-पहले कलेक्टर
 * समानांतर
 * समवर्ती मार्क स्वीप कलेक्टर (सीएमएस)
 * धारावाहिक
 * सी 4 (लगातार समवर्ती कॉम्पैक्टिंग कलेक्टर) * शेनानडोह
 * जेडजीसी

संकलन-समय का उपयोग
संकलन-समय कचरा संग्रह स्थिर कार्यक्रम विश्लेषण का एक रूप है जो मेमोरी को पुन: उपयोग करने और संकलन के दौरान ज्ञात इनवेरिएंट के आधार पर पुनः प्राप्त करने की अनुमति देता है।

कचरा संग्रह के इस रूप का बुध (प्रोग्रामिंग भाषा) में अध्ययन किया गया है, और इसने 2011 में Apple के पारिस्थितिकी तंत्र (iOS और OS X) में LLVM की स्वचालित संदर्भ गणना (एआरसी) की शुरुआत के साथ अधिक उपयोग देखा।

रीयल-टाइम प्रणाली
उदाहरण के लिए हेनरी बेकर (अभिकलित्र वैज्ञानिक) और हेनरी लिबरमैनद्वारा इंक्रीमेंटल, समवर्ती, और रीयल-टाइम कचरा संग्राहक विकसित किए गए हैं।

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

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

कुछ उच्च-स्तरीय भाषा अभिकलित्र आर्किटेक्चर में रीयल-टाइम कचरा संग्रह के लिए हार्डवेयर समर्थन सम्मलित है।

रीयल-टाइम कचरा कलेक्टरों के अधिकांश कार्यान्वयन ट्रेसिंग का उपयोग करते हैं। ऐसे रीयल-टाइम कचरा कलेक्टर रीयल-टाइम ऑपरेटिंग प्रणाली के साथ उपयोग किए जाने पर वास्तविक समय की बाधाओं को पूरा करते हैं।

यह भी देखें

 * विनाशक (अभिकलित्र प्रोग्रामिंग)
 * गतिशील डेड-कोड उन्मूलन
 * स्मार्ट सूचक
 * आभासी मेमोरी संपीड़न

अग्रिम पठन

 * (511 pages)
 * (404 pages)

इस पेज में लापता आंतरिक लिंक की सूची

 * हस्तचालित मेमोरी प्रबंधन
 * विध्वंसक (अभिकलित्र विज्ञान)
 * अभिकलित्र प्रदर्शन
 * एडा (प्रोग्रामिंग भाषा)
 * ढेर (डेटा संरचना)
 * पहुँच योग्य नहीं
 * बग (सॉफ्टवेयर)
 * सूचक (अभिकलित्र प्रोग्रामिंग)
 * लेनदेन प्रक्रिया
 * कचरा संग्रह ट्रेसिंग
 * वर्ग (अभिकलित्र प्रोग्रामिंग)
 * आईओएस 7
 * तुलना और अदला-बदली
 * ढेर आवंटन
 * ढेर आवंटन
 * बोहेम कचरा कलेक्टर
 * उच्च स्तरीय प्रोग्रामिंग भाषा
 * छोटी बात
 * डेल्फी (प्रोग्रामिंग भाषा)
 * स्थैतिक कार्यक्रम विश्लेषण
 * उच्च स्तरीय भाषा अभिकलित्र वास्तुकला
 * कठिन वास्तविक समय

बाहरी संबंध

 * The Memory Management Reference
 * The Very Basics of Garbage Collection
 * Java SE 6 HotSpot™ Virtual Machine Garbage Collection Tuning
 * TinyGC - an independent implementation of the BoehmGC API
 * Conservative Garbage Collection Implementation for C Language
 * MeixnerGC - an incremental mark and sweep garbage collector for C++ using smart pointers