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

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

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

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

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

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

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


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

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

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

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

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

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

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


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


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


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


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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

यह भी देखें

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

अग्रिम पठन

 * (511 pages)
 * (404 pages)

बाहरी संबंध

 * The Memory Management Reference
 * The Very Basics of Garbage Collection
 * जावा 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