ट्रेसिंग गार्बेज संग्रह: Difference between revisions

From Vigyanwiki
No edit summary
(No difference)

Revision as of 15:44, 2 March 2023

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

किसी वस्तु की अभिगम्यता

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

  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);

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

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

सशक्त और कमजोर संदर्भ

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

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

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

कमजोर संग्रह

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

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

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

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

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

नैवे मार्क-एंड-स्वीप

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

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

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

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

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

तिरंगा अंकन

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

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

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

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

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

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

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

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

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

कार्यान्वयन कूट नीतियां

गतिमान vs अचल

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

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

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

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

प्रतिलिपिकरण vs मार्क-एंड-स्वीप vs मार्क-एंड-नॉट-स्वीप

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

स्पष्ट vs रूढ़िवादी और आंतरिक संकेतक

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

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

प्रदर्शन

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

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

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

मैनुअल ढेर आवंटन

  • पर्याप्त आकार के सर्वश्रेष्ठ/पहले-फिट ब्लॉक की खोज करें
  • नि: शुल्क सूची रखरखाव

कवेरिएबल्सा संग्रहण

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

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

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

निश्चयवाद

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

रीयल-टाइम गार्बेज संग्रह

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

जेवीएम के लिए कठिन वास्तविक समय ट्रेसिंग गार्बेज के पहले कार्यान्वयन में से मेट्रोनोम एल्गोरिथ्म पर आधारित था,[10] जिसका व्यावसायिक कार्यान्वयन आईबीएम वेबस्फेयर रियल टाइम के हिस्से के रूप में उपलब्ध है।[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.