ट्रेसिंग गार्बेज संग्रह

From Vigyanwiki
Revision as of 22:25, 1 March 2023 by alpha>Kajal

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

किसी वस्तु की पहुंच क्षमता

अनौपचारिक रूप से, वस्तु पहुंच योग्य होती है यदि इसे कार्यक्रम में कम से कम चर द्वारा संदर्भित किया जाता है, या तो सीधे या अन्य पहुंच योग्य वस्तुओं के संदर्भों के माध्यम से। अधिक सटीक रूप से, वस्तुओं को केवल दो तरीकों से पहुँचा जा सकता है:

  1. जड़ों का विशिष्ट समूह: ऐसी वस्तुएँ जिन्हें माना जाता है कि वे पहुँच योग्य हैं। आमतौर पर, इनमें कॉल स्टैक में कहीं से भी संदर्भित सभी ऑब्जेक्ट सम्मिलित होते हैं (अर्थात, सभी स्थानीय चर और पैरामीटर (कंप्यूटर विज्ञान) वर्तमान में प्रयुक्त किए जा रहे कार्यों में), और कोई भी वैश्विक चर
  2. किसी पहुंच योग्य वस्तु से संदर्भित कोई भी वस्तु स्वयं पहुंच योग्य है; अधिक औपचारिक रूप से, पहुंच योग्यता सकर्मक बंद है।

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

Object x = new Foo();
Object y = new Bar();
x = new Quux();
/* At this point, we know that the Foo object 
 * originally assigned to x will never be
 * accessed: it is syntactic garbage.
 */

/* In the following block, y *could* be semantic garbage;
 * but we won't know until x.check_something() returns
 * some value -- if it returns at all.
 */
if (x.check_something()) {
    x.do_something(y);
}
System.exit(0);

सिमेंटिक कचरे को ठीक से पहचानने की समस्या को आसानी से निर्णय समस्या के रूप में दिखाया जा सकता है: प्रोग्राम जो ऑब्जेक्ट एक्स को आवंटित करता है, मनमाना इनपुट प्रोग्राम पी चलाता है, और एक्स का उपयोग करता है यदि और केवल यदि पी खत्म करने के लिए सिमेंटिक कचरा कलेक्टर की आवश्यकता होती है। संकट। यद्यपि सिमेंटिक कचरा पहचान के लिए रूढ़िवादी हेयुरिस्टिक तरीके सक्रिय अनुसंधान क्षेत्र बने हुए हैं, अनिवार्य रूप से सभी व्यावहारिक कचरा संग्राहक सिंटैक्टिक कचरा पर ध्यान केंद्रित करते हैं।[citation needed]

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

शक्तिशाली और कमजोर संदर्भ

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

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

कुछ कार्यान्वयनों में, कमजोर संदर्भों को उपश्रेणियों में विभाजित किया जाता है। उदाहरण के लिए, जावा वर्चुअल मशीन तीन प्रकार के कमजोर संदर्भ प्रदान करती है, अर्थात् नरम संदर्भ,[1] प्रेत संदर्भ,[2] और नियमित कमजोर संदर्भ।[3] नरम संदर्भित वस्तु केवल सुधार के लिए पात्र है, यदि कचरा संग्रहकर्ता यह निर्णय लेता है कि कार्यक्रम स्मृति पर कम है। नरम संदर्भ या नियमित कमजोर संदर्भ के विपरीत, प्रेत संदर्भ उस वस्तु तक पहुंच प्रदान नहीं करता है जिसे वह संदर्भित करता है। इस के अतिरिक्त, प्रेत संदर्भ तंत्र है जो कचरा संग्राहक को कार्यक्रम को सूचित करने की अनुमति देता है जब संदर्भित वस्तु प्रेत पहुंच योग्य हो जाती है। वस्तु प्रेत पहुंच योग्य है, यदि यह अभी भी स्मृति में रहता है और इसे प्रेत संदर्भ द्वारा संदर्भित किया जाता है, किन्तुइसका अंतिम रूप पहले ही निष्पादित हो चुका है। इसी तरह, .NET Framework|Microsoft.NET कमजोर संदर्भों की दो उपश्रेणियाँ प्रदान करता है,[4] अर्थात् लंबे कमजोर संदर्भ (पुनरुत्थान ट्रैक) और छोटे कमजोर संदर्भ।

कमजोर संग्रह

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

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

इस तरह के उद्देश्य के लिए नियमित हैश तालिका का उपयोग तार्किक स्मृति रिसाव का कारण बन सकता है: पहुंच योग्य डेटा का संचय जिसकी प्रोग्राम को आवश्यकता नहीं है और वह उपयोग नहीं करेगा।

बेसिक एल्गोरिदम

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

भोली मार्क-एंड-स्वीप

डायनेमिक मेमोरी एलोकेशन # मैनुअल मेमोरी मैनेजमेंट युक्त आठ ऑब्जेक्ट (कंप्यूटर साइंस) पर कार्रवाई में नैव मार्क-एंड-स्वीप। तीर वस्तु उन्मुख भाषाओं में संदर्भ (कंप्यूटर विज्ञान)#References का प्रतिनिधित्व करते हैं। वृत्त स्वयं वस्तुओं का प्रतिनिधित्व करते हैं। ऑब्जेक्ट #1, #2, #3, #4, और #6 रूट सेट से दृढ़ता से संदर्भित हैं। दूसरी ओर, वस्तुओं #5, #7, और #8 को रूट सेट से प्रत्यक्ष या अप्रत्यक्ष रूप से दृढ़ता से संदर्भित नहीं किया जाता है; इसलिए, वे कचरा हैं।

भोली मार्क-एंड-स्वीप विधि में, स्मृति में प्रत्येक वस्तु में ध्वज (आमतौर पर एक बिट) होता है जो केवल कचरा संग्रहण उपयोग के लिए आरक्षित होता है। संग्रह चक्र को छोड़कर, यह ध्वज सदैव साफ़ किया जाता है।

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

दूसरे चरण में, 'स्वीप स्टेज', सभी मेमोरी को प्रारंभिकू से अंत तक स्कैन किया जाता है, सभी मुक्त या उपयोग किए गए ब्लॉकों की जांच की जाती है; जिन्हें 'उपयोग में' के रूप में चिह्नित नहीं किया गया है, वे किसी भी रूट से पहुंच योग्य नहीं हैं, और उनकी स्मृति मुक्त हो जाती है। जिन वस्तुओं को उपयोग में चिह्नित किया गया था, उनके लिए उपयोग में आने वाले झंडे को साफ कर दिया गया है, अगले चक्र की तैयारी कर रहा है।

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

तिरंगा अंकन

8 वस्तुओं के ढेर पर तिरंगा अंकन का उदाहरण। सफेद, ग्रे और काली वस्तुओं को क्रमशः हल्के-ग्रे, पीले और नीले रंग से दर्शाया जाता है।

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

तीन सेट बनाए गए हैं – सफेद, काला और ग्रे:

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

कई एल्गोरिदम में, प्रारंभ में काला सेट खाली के रूप में प्रारंभिकू होता है, ग्रे सेट वस्तुओं का सेट होता है जिसे सीधे जड़ों से संदर्भित किया जाता है और सफेद सेट में अन्य सभी ऑब्जेक्ट सम्मिलित होते हैं। स्मृति में प्रत्येक वस्तु सदैव तीन सेटों में से में होती है। एल्गोरिथ्म निम्नानुसार आगे बढ़ता है:

  1. ग्रे सेट से कोई वस्तु चुनें और उसे काले सेट में ले जाएँ।
  2. ग्रे सेट के संदर्भ में प्रत्येक सफेद वस्तु को स्थानांतरित करें। यह सुनिश्चित करता है कि न तो यह वस्तु और न ही इसके संदर्भ में कोई वस्तु कचरा-एकत्रित की जा सकती है।
  3. पिछले दो चरणों को तब तक दोहराएं जब तक कि ग्रे सेट खाली न हो जाए।

जब ग्रे सेट खाली होता है, तो स्कैन पूरा हो जाता है; काली वस्तुओं को जड़ों से प्राप्त किया जा सकता है, जबकि सफेद वस्तुओं को कचरा-एकत्रित नहीं किया जा सकता है।

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

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

कार्यान्वयन रणनीतियाँ

चल बनाम अचल

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

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

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

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


कॉपी करना बनाम मार्क-एंड-स्वीप बनाम मार्क-एंड-नॉट-स्वीप

संग्राहक न केवल इस बात में भिन्न होते हैं कि वे चल रहे हैं या गैर-चल रहे हैं, उन्हें यह भी वर्गीकृत किया जा सकता है कि वे संग्रह चक्र के समयसफेद, ग्रे और काले ऑब्जेक्ट सेट का इलाज कैसे करते हैं।

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

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

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

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

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

इसलिए मार्क और स्वीप न करें रणनीति को मार्क और स्वीप और स्टॉप और कॉपी रणनीतियों के उतार-चढ़ाव के बीच समझौते के रूप में देखा जा सकता है।

जनरेशनल जीसी (अल्पकालिक जीसी)

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

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

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

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

स्टॉप-द-वर्ल्ड बनाम वृद्धिशील बनाम समवर्ती

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

इसका हानि यह है कि संग्रह चक्र चलने के समयकार्यक्रम कोई उपयोगी कार्य नहीं कर सकता है (कभी-कभी शर्मनाक ठहराव कहा जाता है)[6]). स्टॉप-द-वर्ल्ड कचरा संग्रह इसलिए मुख्य रूप से गैर-संवादात्मक कार्यक्रमों के लिए उपयुक्त है। इसका लाभ यह है कि इसे प्रयुक्त करना आसान है और वृद्धिशील कचरा संग्रहण की तुलना में तेज़ है।

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

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

सटीक बनाम रूढ़िवादी और आंतरिक संकेतक

कुछ संग्राहक किसी वस्तु में सभी संकेतकों (संदर्भों) की सही पहचान कर सकते हैं; इन्हें सटीक (सटीक या सटीक) संग्राहक भी कहा जाता है, इसके विपरीत रूढ़िवादी या आंशिक रूप से रूढ़िवादी संग्राहक होते हैं। कंज़र्वेटिव कलेक्टर मानते हैं कि स्मृति में कोई भी बिट पैटर्न सूचक हो सकता है, यदि सूचक के रूप में व्याख्या की जाती है, तो यह आवंटित वस्तु में इंगित करेगा। कंजर्वेटिव कलेक्टर झूठी सकारात्मकता उत्पन्न कर सकते हैं, जहां अनुपयुक्त सूचक पहचान के कारण अप्रयुक्त स्मृति जारी नहीं की जाती है। यह व्यवहार में सदैव समस्या नहीं है जब तक कि प्रोग्राम बहुत सारे डेटा को संभालता नहीं है जिसे आसानी से सूचक के रूप में गलत पहचाना जा सकता है। 32-बिट प्रणाली की तुलना में 64-बिट कंप्यूटिंग | 64-बिट प्रणाली पर झूठी सकारात्मकता सामान्यतः कम समस्याग्रस्त होती है क्योंकि मान्य मेमोरी पतों की सीमा 64-बिट मानों की सीमा का छोटा अंश होती है। इस प्रकार, मनमानी 64-बिट पैटर्न वैध सूचक की नकल करने की संभावना नहीं है। यदि पॉइंटर्स छिपे हुए हैं, उदाहरण के लिए XOR लिंक्ड सूची का उपयोग करते हुए गलत नकारात्मक भी हो सकता है। क्या सटीक संग्राहक व्यावहारिक है, आमतौर पर प्रश्न में प्रोग्रामिंग भाषा के प्रकार के सुरक्षा गुणों पर निर्भर करता है। उदाहरण जिसके लिए रूढ़िवादी कचरा संग्राहक की आवश्यकता होगी, सी (प्रोग्रामिंग भाषा) है, जो टाइप किए गए (गैर-शून्य) पॉइंटर्स को अनटाइप्ड (शून्य) पॉइंटर्स में टाइप करने की अनुमति देता है, और इसके विपरीत।

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

प्रदर्शन

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

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

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

मैनुअल ढेर आवंटन
  • पर्याप्त आकार के सर्वश्रेष्ठ/पहले-फिट ब्लॉक की खोज करें
  • नि: शुल्क सूची रखरखाव
कचरा संग्रहण
  • पहुंच योग्य वस्तुओं का पता लगाएं
  • मूविंग कलेक्टर्स के लिए रीचेबल ऑब्जेक्ट्स को कॉपी करें
  • वृद्धिशील संग्राहकों के लिए अवरोध पढ़ें/लिखें
  • बेस्ट/फर्स्ट-फिट ब्लॉक की तलाश करें और नॉन-मूविंग कलेक्टर्स के लिए फ्री लिस्ट मेंटेनेंस करें

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

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

निश्चयवाद

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

रीयल-टाइम कचरा संग्रह

जबकि कचरा संग्रह सामान्यतः गैर-नियतात्मक होता है, इसका उपयोग हार्ड रीयल-टाइम कंप्यूटिंग | रीयल-टाइम प्रणाली में करना संभव है। वास्तविक समय कचरा संग्राहक को यह गारंटी देनी चाहिए कि सबसे खराब स्थिति में भी यह निश्चित संख्या में कम्प्यूटेशनल संसाधनों को म्यूटेटर थ्रेड्स को समर्पित करेगा। रीयल-टाइम कचरा संग्राहक पर लगाए गए प्रतिबंध आमतौर पर या तो कार्य-आधारित या समय-आधारित होते हैं। एक समय आधारित बाधा इस तरह दिखेगी: अवधि टी की प्रत्येक समय खिड़की के अंदर, म्यूटेटर थ्रेड्स को कम से कम टीएम समय के लिए चलने की अनुमति दी जानी चाहिए। कार्य आधारित विश्लेषण के लिए, एमएमयू (न्यूनतम म्यूटेटर उपयोग)[9] आमतौर पर कचरा संग्रहण एल्गोरिदम के लिए रीयल-टाइम बाधा के रूप में उपयोग किया जाता है।

जेवीएम के लिए कठिन वास्तविक समय कचरा संग्रह के पहले कार्यान्वयन में से मेट्रोनोम एल्गोरिथ्म पर आधारित था,[10] जिसका व्यावसायिक कार्यान्वयन IBM WebSphere Real Time के हिस्से के रूप में उपलब्ध है।[11] अन्य कठिन रीयल-टाइम कचरा संग्रह एल्गोरिथ्म स्टैकाटो है, जो आईबीएम के आईबीएम जे 9 में उपलब्ध है, जो मेट्रोनोम और अन्य एल्गोरिदम पर विभिन्न फायदे लाते हुए बड़े मल्टीप्रोसेसर आर्किटेक्चर को स्केलेबिलिटी प्रदान करता है, इसके विपरीत, विशेष हार्डवेयर की आवश्यकता होती है।[12]

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


यह भी देखें

संदर्भ

  1. "Class SoftReference<T>". Java™ Platform Standard Ed. 7. Oracle. Retrieved 25 May 2013.
  2. "Class PhantomReference<T>". Java™ Platform Standard Ed. 7. Oracle. Retrieved 25 May 2013.
  3. "Class WeakReference<T>". Java™ Platform Standard Ed. 7. Oracle. Retrieved 25 May 2013.
  4. "कमजोर संदर्भ". .NET Framework 4.5. Microsoft. Retrieved 25 May 2013.
  5. "कॉपी करना और पिन करना". Microsoft Docs. Retrieved 2022-04-25.
  6. Steele, Guy L. (September 1975). "मल्टीप्रोसेसिंग कॉम्पैक्टिंग कचरा संग्रह". Communications of the ACM. 18 (9): 495–508. doi:10.1145/361002.361005. S2CID 29412244.
  7. Appel, Andrew W. (June 17, 1987). "ढेर आवंटन की तुलना में कचरा संग्रह तेजी से हो सकता है" (PDF). Information Processing Letters. 25 (4): 275–279. CiteSeerX 10.1.1.49.2537. doi:10.1016/0020-0190(87)90175-X. S2CID 2575400. Retrieved 2022-04-25.
  8. Hopwood, David (January 1, 2007). "एम्बेडेड सिस्टम में मेमोरी आवंटन". cap-talk (Mailing list). EROS. Archived from the original on 2015-09-24.
  9. Cheng, Perry; Blelloch, Guy E. (June 22, 2001). "एक समानांतर, रीयल-टाइम कचरा संग्राहक" (PDF). ACM SIGPLAN Notices. 36 (5): 125–136. doi:10.1145/381694.378823.
  10. Bacon, David F.; Cheng, Perry; Rajan, V. T. (November 2003). "The Metronome: A Simpler Approach to Garbage Collection in Real-Time Systems" (PDF). In Corsaro, Angelo; Cytron, Ron; Santoro, Corrado (eds.). Workshop on Java Technologies for Real-Time and Embedded Systems. JTRES'03. OTM 2003 Workshops. On The Move to Meaningful Internet Systems 2003. LNCS. Vol. 2889. pp. 466–478. CiteSeerX 10.1.1.3.8544. doi:10.1007/978-3-540-39962-9_52. ISBN 3-540-20494-6. ISSN 0302-9743. S2CID 14565934. Archived from the original (PDF) on 2006-10-26.
  11. Biron, Benjamin; Sciampacone, Ryan (May 2, 2007). "Real-time Java, Part 4: Real-time garbage collection". IBM DeveloperWorks. Archived from the original on 2020-11-09.
  12. McCloskey, Bill; Bacon, David F.; Cheng, Perry; Grove, David (February 22, 2008). Staccato: A Parallel and Concurrent Real-time Compacting Garbage Collector for Multiprocessors (PDF) (Technical report). IBM Research Division. RC24504. Retrieved 2022-04-25.
  13. Pizlo, Phil; Petrank, Erez; Steensgaard, Bjarne (June 2008). Proceedings of the 29th ACM SIGPLAN Conference on Programming Language Design and Implementation (PDF). PLDI 2008 Conferenece. pp. 33–44. CiteSeerX 10.1.1.3.8544. doi:10.1145/1375581.1375587. ISBN 9781595938602.