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

From Vigyanwiki

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

किसी ऑब्जेक्ट की अभिगम्यता

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

  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] अर्थात् लंबे अशक्त संदर्भ (पुनरुत्थान ट्रैक) और छोटे अशक्त संदर्भ है ।

अशक्त संग्रह

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

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

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

बेसिक एल्गोरिथ्म विधि

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

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

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

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

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

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

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

त्रि-रंग अंकन

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

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

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

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

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

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

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

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

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

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

गतिमान बनाम अचल

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

कुछ संग्राहक किसी ऑब्जेक्ट में सभी संकेतकों (संदर्भों) की सही पहचान कर सकते हैं; इन्हें स्पष्ट संग्राहक भी कहा जाता है, इसके विपरीत रूढ़िवादी या आंशिक रूप से रूढ़िवादी संग्राहक होते हैं। कंज़र्वेटिव संग्राहक मानते हैं कि मेमोरी में कोई भी बिट पैटर्न सूचक हो सकता है, यदि सूचक के रूप में व्याख्या की जाती है, तो यह आवंटित ऑब्जेक्ट में इंगित करेगा। कंजर्वेटिव संग्राहक झूठी सकारात्मकता उत्पन्न कर सकते हैं, जहां अनुपयुक्त सूचक पहचान के कारण अप्रयुक्त मेमोरी जारी नहीं की जाती है। यह व्यवहार में सदैव समस्या नहीं है जब तक कि प्रोग्राम बहुत सारे डेटा को संभालता नहीं है जिसे आसानी से सूचक के रूप में गलत पहचाना जा सकता है। 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.