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

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

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

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

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

सिंहावलोकन

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

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

लाभ

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

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

नुकसान

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

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

रणनीतियाँ

अनुरेखण

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

संदर्भ गणना

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

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

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

चक्र
यदि दो या दो से अधिक वस्तुएँ एक-दूसरे को संदर्भित करती हैं, तो वे एक ऐसा चक्र बना सकते हैं जिससे न तो एकत्र किया जाएगा क्योंकि उनके पारस्परिक संदर्भ कभी भी उनकी संदर्भ संख्या को शून्य नहीं होने देंगे। संदर्भ गणना का उपयोग करने वाली कुछ कचरा संग्रह प्रणालियाँ (जैसे कि सीपीथॉन में) इस मुद्दे से निपटने के लिए विशिष्ट चक्र-पता लगाने वाले कलन विधि का उपयोग करती हैं।[10]एक और रणनीति "बैकपॉइंटर्स" के लिए कमजोर संदर्भ का उपयोग करना है जो चक्र बनाते हैं। संदर्भ गणना के अनुसार, कमजोर संदर्भ अनुरेखण कचरा संग्राहक के अनुसार कमजोर संदर्भ के समान होता है। यह एक विशेष संदर्भ वस्तु है जिसका अस्तित्व दिग्दर्शन वस्तु की संदर्भ संख्या में वृद्धि नहीं करता है। इसके अतिरिक्त, कमजोर संदर्भ सुरक्षित है क्योंकि जब संदर्भित वस्तु कचरा बन जाती है, तो इसके लिए कोई भी कमजोर संदर्भ समाप्त हो जाता है, न कि लटकने की अनुमति दी जाती है, जिसका अर्थ है कि यह एक अनुमानित मूल्य में बदल जाता है, जैसे कि एक अशक्त संदर्भ में बदल जाता है।
स्पेस उपरि (संदर्भ गणना)
संदर्भ गणना के लिए प्रत्येक वस्तु को उसकी संदर्भ गणना को संग्रह करने के लिए स्पेस आवंटित करने की आवश्यकता होती है। गणना को वस्तु की स्मृति के पास या साइड टेबल में कहीं और संग्रह किया जा सकता है, लेकिन किसी भी स्थिति में, हर एक संदर्भ गणना वस्तु को इसके संदर्भ गणना के लिए अतिरिक्त भंडारण की आवश्यकता होती है। एक अहस्ताक्षरित सूचक के आकार के साथ स्मृति स्पेस सामान्यतः इस कार्य के लिए उपयोग किया जाता है, जिसका अर्थ है कि प्रत्येक वस्तु के लिए 32 या 64 बिट संदर्भ गणना भंडारण आवंटित किया जाना चाहिए। कुछ प्रणालियों पर, वस्तु की स्मृति के अप्रयुक्त क्षेत्रों में संदर्भ गणना को संग्रहीत करने के लिए टैग किए गए सूचक का उपयोग करके इस उपरि को कम करना संभव हो सकता है। अधिकांशतः, संरचना वास्तव में प्रोग्राम को स्मृति पतों की पूरी श्रृंखला तक पहुंचने की अनुमति नहीं देता है जो उसके मूल सूचक आकार में संग्रहीत किया जा सकता है, पते में कुछ उच्च बिट्स को या तो अनदेखा किया जाता है या शून्य होना आवश्यक है। यदि किसी वस्तु के पास निश्चित स्थान पर सूचक है, तो संदर्भ संख्या को सूचक के अप्रयुक्त बिट्स में संग्रहीत किया जा सकता है। उदाहरण के लिए, ऑब्जेक्टिव-सी में प्रत्येक वस्तु की स्मृति की शुरुआत में उसकी कक्षा के लिए एक सूचक होता है, आईओएस 7 का उपयोग करते हुए एआरएम 64 संरचना पर, इस क्लास सूचक के 19 अप्रयुक्त बिट्स का उपयोग वस्तु की संदर्भ गणना को संग्रह करने के लिए किया जाता है।[11][12]
स्पीड उपरि (वृद्धि/कमी)
भोले-भाले कार्यान्वयन में, संदर्भ के प्रत्येक समनुदेशन और दायरे से बाहर होने वाले प्रत्येक संदर्भ में अधिकांशतः एक या अधिक संदर्भ काउंटरों के संशोधन की आवश्यकता होती है। चूंकि, सामान्य मामले में जब किसी बाहरी दायरे के चर से आंतरिक दायरे के चर में संदर्भ की नकल की जाती है, जैसे कि आंतरिक चर का जीवनकाल बाहरी के जीवनकाल से घिरा होता है, तो संदर्भ वृद्धि को समाप्त किया जा सकता है। बाहरी चर "स्वामित्व" संदर्भ। प्रोग्रामिंग भाषा सी ++ में, इस तकनीक को const संदर्भों के उपयोग के साथ आसानी से कार्यान्वित और प्रदर्शित किया जाता है। सी ++ में संदर्भ गणना सामान्यतः स्मार्ट सूचक[13]का उपयोग करके कार्यान्वित की जाती है जिनके निर्माता, विनाशक और समनुदेशन ऑपरेटर संदर्भों का प्रबंधन करते हैं। स्मार्ट सूचक को एक फ़ंक्शन के संदर्भ में पास किया जा सकता है, जो नए स्मार्ट सूचक को कॉपी-निर्माण करने की आवश्यकता से बचा जाता है (जो फ़ंक्शन में प्रवेश पर संदर्भ संख्या को बढ़ाएगा और बाहर निकलने पर इसे कम करेगा)। इसकेअतिरिक्त फ़ंक्शन स्मार्ट सूचक का संदर्भ प्राप्त करता है जो सस्ते में निर्मित होता है। संदर्भ गणना की देउत्स्च-बॉब्रो विधि इस तथ्य पर निर्भर करती है कि अधिकांश संदर्भ गणना अद्यतन वास्तव में स्थानीय चरों में संग्रहीत संदर्भों द्वारा उत्पन्न होते हैं। यह इन संदर्भों को अनदेखा करता है, केवल संचित में संदर्भों की गणना करता है, लेकिन इससे पहले कि संदर्भ संख्या शून्य के साथ किसी वस्तु को हटाया जा सके, प्रणाली को क्रमबद्ध के स्कैन के साथ सत्यापित करना चाहिए और यह दर्ज करना चाहिए कि इसके लिए कोई अन्य संदर्भ अभी भी सम्मलित नहीं है। लेवानोनी और एरेज़ पेट्रैंक द्वारा पेश किए गए आधुनिक संधित द्वारा काउंटर आधुनिक पर उपरि में एक और पर्याप्त कमी प्राप्त की जा सकती है।[14][15] सूचक पर विचार करें कि निष्पादन के दिए गए अंतराल में कई बार अद्यतन किया जाता है। यह पहले एक वस्तु O1,की ओर इशारा करता है, फिर एक वस्तु O2,की ओर, और आगे भी अंतराल के अंत तक यह किसी वस्तु की ओर इशारा करता है। संदर्भ गणना कलन विधि सामान्यतः rc(O1)--, rc(O2)++, rc(O2)--, rc(O3)++, rc(O3)--, ..., rc(On)++ निष्पादित करेगा। लेकिन इनमें से अधिकतर अद्यतन बेमानी हैं। अंतराल के अंत में संदर्भ संख्या का उचित मूल्यांकन करने के लिए यह rc(O1)-- तथा rc(On)++. करने के लिए पर्याप्त है। लेवानोनी और पेट्रैंक ने विशिष्ट जावा बेंचमार्क में 99% से अधिक काउंटर आधुनिक के उन्मूलन को मापा था।
परमाणुता की आवश्यकता है
जब बहुप्रचारित (कंप्यूटिंग) वातावरण में उपयोग किया जाता है, तो इन संशोधनों (वृद्धि और कमी) को परमाणु संचालन की आवश्यकता हो सकती है जैसे कि तुलना-और-स्वैप, कम से कम किसी भी वस्तु के लिए जो साझा की जाती है, या संभावित रूप से कई थ्रेड्स के बीच साझा की जाती है। बहुप्रक्रमक पर परमाणु संचालन महंगे होते हैं, और इससे भी अधिक महंगे होते हैं यदि उन्हें सॉफ्टवेयर कलन विधि के साथ अनुकरण करना पड़ता है। प्रति-थ्रेड या प्रति-सीपीयू संदर्भ गणना जोड़कर और केवल वैश्विक संदर्भ गणना तक पहुंच बनाकर इस समस्या से बचना संभव है, जब स्थानीय संदर्भ संख्या शून्य हो जाती है या शून्य नहीं होती है (या, वैकल्पिक रूप से, संदर्भ गणना के द्वयी तरू का उपयोग करके, या यहां तक कि ग्लोबल संदर्भ गणना न होने के बदले में नियतात्मक विनाश को छोड़ देना), लेकिन यह महत्वपूर्ण स्मृति उपरि जोड़ता है और इस तरह केवल विशेष स्थितियों में उपयोगी होता है (उदाहरण के लिए, लिनक्स कर्नेल इकाई की संदर्भ गणना में इसका उपयोग किया जाता है) ). लेवानोनी और पेट्रैंक द्वारा आधुनिक संधित[14][15]का उपयोग लेखन-बाधा से सभी परमाणु संचालन को खत्म करने के लिए किया जा सकता है। प्रोग्राम निष्पादन के दौरान प्रोग्राम थ्रेड्स द्वारा काउंटरों को कभी भी आधुनिक नहीं किया जाता है। वे केवल संग्राहक द्वारा संशोधित किए जाते हैं जो बिना किसी तुल्यकालन के अतिरिक्त थ्रेड के रूप में निष्पादित होते हैं। इस विधि का उपयोग समांतर कार्यक्रमों के लिए स्टॉप-द-वर्ल्ड तंत्र के रूप में और समवर्ती संदर्भ गणना कलेक्टर के साथ भी किया जा सकता है।
वास्तविक समय नहीं
संदर्भ गणना के भोले-भाले कार्यान्वयन सामान्यतः ससमय व्यवहार प्रदान नहीं करते हैं, क्योंकि कोई भी सूचक समनुदेशन संभावित रूप से कुल आबंटित स्मृति साइज से बंधी हुई कई वस्तुओं को पुनरावर्ती रूप से मुक्त कर सकता है, जबकि थ्रेड अन्य कार्य करने में असमर्थ है। अतिरिक्त उपरि की कीमत पर, अन्य थ्रेड्स के लिए अप्रतिबंधित वस्तुओं को मुक्त करके इस मुद्दे से बचना संभव है।

पलायन विश्लेषण

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

उपलब्धता

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

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

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

बुनियादी

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

उद्देश्य-सी

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

सीमित वातावरण

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

जावा

Java JDKs में उपलब्ध कचरा संग्राहकों में सम्मलित हैं:

संकलन-समय का उपयोग

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

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


ससमय प्रणाली

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

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

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

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

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


यह भी देखें

संदर्भ

  1. Abelson, Harold; Sussman, Gerald Jay; Sussman, Julie (2016). Structure and Interpretation of Computer Programs (PDF) (2nd ed.). Cambridge, Massachusetts, USA: MIT Press. pp. 734–736.
  2. McCarthy, John (1960). "Recursive functions of symbolic expressions and their computation by machine, Part I". Communications of the ACM. 3 (4): 184–195. doi:10.1145/367177.367199. S2CID 1489409. Retrieved 2009-05-29.
  3. "प्रोग्रामिंग में कचरा संग्रह (जीसी) क्या है?". SearchStorage (in English). Retrieved 2022-10-17.
  4. "Overview — D Programming Language". dlang.org. Digital Mars. Retrieved 2014-07-29.
  5. "कचरा संग्रह - डी प्रोग्रामिंग भाषा". dlang.org. Retrieved 2022-10-17.
  6. Zorn, Benjamin (1993-01-22). "The Measured Cost of Conservative Garbage Collection". Software: Practice and Experience. Department of Computer Science, University of Colorado Boulder. 23 (7): 733–756. CiteSeerX 10.1.1.14.1816. doi:10.1002/spe.4380230704. S2CID 16182444.
  7. Hertz, Matthew; Berger, Emery D. (2005). "Quantifying the Performance of Garbage Collection vs. Explicit Memory Management" (PDF). Proceedings of the 20th Annual ACM SIGPLAN Conference on Object-Oriented Programming, Systems, Languages, and Applications - OOPSLA '05. p. 313. doi:10.1145/1094811.1094836. ISBN 1-59593031-0. S2CID 6570650. Archived (PDF) from the original on 2012-04-02. Retrieved 2015-03-15.
  8. 8.0 8.1 "Developer Tools Kickoff — session 300" (PDF). WWDC 2011. Apple, Inc. 2011-06-24. Retrieved 2015-03-27.
  9. "Reference Counting Garbage Collection".
  10. "Reference Counts". Extending and Embedding the Python Interpreter. 2008-02-21. Retrieved 2014-05-22.
  11. Ash, Mike. "Friday Q&A 2013-09-27: ARM64 and You". mikeash.com. Retrieved 2014-04-27.
  12. "Hamster Emporium: [objc explain]: Non-pointer isa". Sealiesoftware.com. 2013-09-24. Retrieved 2014-04-27.
  13. Pibinger, Roland (2005-05-03) [2005-04-17]. "RAII, Dynamic Objects, and Factories in C++".
  14. 14.0 14.1 Levanoni, Yossi; Petrank, Erez (2001). "An on-the-fly reference-counting garbage collector for java". Proceedings of the 16th ACM SIGPLAN Conference on Object-Oriented Programming, Systems, Languages, and Applications. OOPSLA 2001. pp. 367–380. doi:10.1145/504282.504309.
  15. 15.0 15.1 Levanoni, Yossi; Petrank, Erez (2006). "An on-the-fly reference-counting garbage collector for java". ACM Trans. Program. Lang. Syst. 28: 31–69. CiteSeerX 10.1.1.15.9106. doi:10.1145/1111596.1111597. S2CID 14777709.
  16. Salagnac, Guillaume; Yovine, Sergio; Garbervetsky, Diego (2005-05-24). "Fast Escape Analysis for Region-based Memory Management". Electronic Notes in Theoretical Computer Science. 131: 99–110. doi:10.1016/j.entcs.2005.01.026.
  17. Chisnall, David (2011-01-12). Influential Programming Languages, Part 4: Lisp.
  18. "PHP: Performance Considerations". php.net. Retrieved 2015-01-14.
  19. "Altair 8800 Basic 4.1 Reference Manual" (PDF). The Vintage Technology Digital Archive. April 1977. p. 108. Archived (PDF) from the original on 2021-06-29. Retrieved 2021-06-29.
  20. "I did some work to speed up string garbage collection under Applesoft..." Hacker News. Retrieved 2021-06-29.
  21. Little, Gary B. (1985). Inside the Apple IIc. Bowie, Md.: Brady Communications Co. p. 82. ISBN 0-89303-564-5. Retrieved 2021-06-29.
  22. "Fast Garbage Collection". Call-A.P.P.L.E.: 40–45. January 1981.
  23. Worth, Don (1984). Beneath Apple Pro DOS (PDF) (March 1985 printing ed.). Chatsworth, California, USA: Quality Software. pp. 2–6. ISBN 0-912985-05-4. Archived (PDF) from the original on 2008-12-03. Retrieved 2021-06-29.
  24. "Objective-C 2.0 Overview". Archived from the original on 2010-07-24.
  25. Siracusa, John (2011-07-20). "Mac OS X 10.7 Lion: the Ars Technica review".
  26. 26.0 26.1 "Apple says Mac app makers must transition to ARC memory management by May". AppleInsider. 2015-02-20.
  27. Cichon, Waldemar (2015-02-21). "App Store: Apple entfernt Programme mit Garbage Collection". Heise.de. Retrieved 2015-03-30.
  28. Silva, Precious (2014-11-18). "iOS 8 vs Android 5.0 Lollipop: Apple Kills Google with Memory Efficiency". International Business Times. Retrieved 2015-04-07.
  29. 29.0 29.1 Napier, Rob; Kumar, Mugunth (2012-11-20). iOS 6 Programming Pushing the Limit. John Wiley & Sons. ISBN 978-1-11844997-4. Retrieved 2015-03-30.
  30. 30.0 30.1 Cruz, José R. C. (2012-05-22). "Automatic Reference Counting on iOS". Dr. Dobbs. Retrieved 2015-03-30.
  31. Fu, Wei; Hauser, Carl (2005). "A real-time garbage collection framework for embedded systems". Proceedings of the 2005 Workshop on Software and Compilers for Embedded Systems - SCOPES '05. pp. 20–26. doi:10.1145/1140389.1140392. ISBN 1-59593207-0. S2CID 8635481.
  32. Tene, Gil; Iyengar, Balaji; Wolf, Michael (2011). "C4: the continuously concurrent compacting collector" (PDF). ISMM '11: Proceedings of the international symposium on Memory management. doi:10.1145/1993478. ISBN 978-1-45030263-0. Archived (PDF) from the original on 2017-08-09.
  33. Mazur, Nancy (May 2004). Compile-time garbage collection for the declarative language Mercury (PDF) (Thesis). Katholieke Universiteit Leuven. Archived (PDF) from the original on 2014-04-27.
  34. Huelsbergen, Lorenz; Winterbottom, Phil (1998). "Very concurrent mark-&-sweep garbage collection without fine-grain synchronization" (PDF). Proceedings of the First International Symposium on Memory Management - ISMM '98. pp. 166–175. doi:10.1145/286860.286878. ISBN 1-58113114-3. S2CID 14399427. Archived (PDF) from the original on 2008-05-13.
  35. "GC FAQ".
  36. Lieberman, Henry; Hewitt, Carl (1983). "A real-time garbage collector based on the lifetimes of objects". Communications of the ACM. 26 (6): 419–429. doi:10.1145/358141.358147. hdl:1721.1/6335. S2CID 14161480.
  37. Baker, Henry G. (1978). "List processing in real time on a serial computer". Communications of the ACM. 21 (4): 280–294. doi:10.1145/359460.359470. hdl:1721.1/41976. S2CID 17661259. see also description
  38. McCloskey; Bacon; Cheng; Grove (2008), Staccato: A Parallel and Concurrent Real-time Compacting Garbage Collector for Multiprocessors (PDF), archived (PDF) from the original on 2014-03-11
Cite error: <ref> tag with name "nanoframework" defined in <references> is not used in prior text.


अग्रिम पठन


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

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

बाहरी संबंध