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

From Vigyanwiki
No edit summary
No edit summary
 
(10 intermediate revisions by 5 users not shown)
Line 1: Line 1:
{{More references|date=July 2016}}
[[कंप्यूटर प्रोग्रामिंग]] में, '''ट्रेसिंग गार्बेज''' का पता लगाना स्वचालित मेमोरी प्रबंधन का रूप है जिसमें यह निर्धारित करना होता है कि किन ऑब्जेक्ट को कुछ रूट ऑब्जेक्ट से संदर्भों की श्रृंखला द्वारा पहुंचने योग्य ऑब्जेक्ट का पता लगाने के द्वारा (गार्बेज एकत्र किया जाना चाहिए) हटा दिया जाना चाहिए। गार्बेज के रूप में आराम करो और उन्हें इकट्ठा करो। ट्रेसिंग गार्बेज का पता लगाना सबसे सामान्य प्रकार का ट्रेसिंग गार्बेज [[कचरा संग्रह (कंप्यूटर विज्ञान)|(कंप्यूटर विज्ञान)]] है - इतना अधिक कि ट्रेसिंग गार्बेज अधिकांशतः अन्य प्रकार जैसे संदर्भ गणना के अतिरिक्त ट्रेसिंग गार्बेज का पता लगाने के लिए संदर्भित होता है - और कार्यान्वयन में बड़ी संख्या में एल्गोरिथ्म विधि का उपयोग किया जाता है।


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


== किसी वस्तु की पहुंच क्षमता ==
# रूट का विशिष्ट सेट: ऐसी वस्तुएँ जिन्हें माना जाता है कि वे पहुँच योग्य हैं। सामान्यतः, इनमें [[कॉल स्टैक]] में कहीं से भी संदर्भित सभी ऑब्जेक्ट सम्मिलित होते हैं (अर्थात, सभी [[स्थानीय चर|स्थानीय वेरिएबल्स]] और [[पैरामीटर (कंप्यूटर विज्ञान)]] वर्तमान में प्रयुक्त किए जा रहे कार्यों में), और कोई भी [[वैश्विक चर|वैश्विक वेरिएबल्स]]।
अनौपचारिक रूप से, वस्तु पहुंच योग्य होती है यदि इसे कार्यक्रम में कम से कम चर द्वारा संदर्भित किया जाता है, या तो सीधे या अन्य पहुंच योग्य वस्तुओं के संदर्भों के माध्यम से। अधिक सटीक रूप से, वस्तुओं को केवल दो तरीकों से पहुँचा जा सकता है:
# किसी पहुंच योग्य ऑब्जेक्ट से संदर्भित कोई भी ऑब्जेक्ट स्वयं पहुंच योग्य है; अधिक औपचारिक रूप से, पहुंच योग्यता [[सकर्मक बंद]] है।


# जड़ों का विशिष्ट समूह: ऐसी वस्तुएँ जिन्हें माना जाता है कि वे पहुँच योग्य हैं। आमतौर पर, इनमें [[कॉल स्टैक]] में कहीं से भी संदर्भित सभी ऑब्जेक्ट सम्मिलित होते हैं (अर्थात, सभी [[स्थानीय चर]] और [[पैरामीटर (कंप्यूटर विज्ञान)]] वर्तमान में प्रयुक्त किए जा रहे कार्यों में), और कोई भी [[वैश्विक चर]]।
गार्बेज की पहुंच योग्यता परिभाषा इष्टतम नहीं है, क्योंकि पिछली बार जब कोई प्रोग्राम किसी ऑब्जेक्ट का उपयोग करता है, तो उस ऑब्जेक्ट के पर्यावरण के दायरे से बाहर होने से बहुत पहले हो सकता है। कभी-कभी [[वाक्यात्मक कचरा|वाक्यात्मक]] गार्बेज के बीच अंतर तैयार किया जाता है, उन ऑब्जेक्ट को प्रोग्राम संभवतः नहीं पहुंच सकता है, और [[सिमेंटिक कचरा|सिमेंटिक गार्बेज]], उन ऑब्जेक्ट का प्रोग्राम वास्तव में फिर कभी उपयोग नहीं करेगा। उदाहरण के लिए:
# किसी पहुंच योग्य वस्तु से संदर्भित कोई भी वस्तु स्वयं पहुंच योग्य है; अधिक औपचारिक रूप से, पहुंच योग्यता [[सकर्मक बंद]] है।
 
कचरे की पहुंच योग्यता परिभाषा इष्टतम नहीं है, क्योंकि पिछली बार जब कोई प्रोग्राम किसी वस्तु का उपयोग करता है, तो उस वस्तु के पर्यावरण के दायरे से बाहर होने से बहुत पहले हो सकता है। कभी-कभी [[वाक्यात्मक कचरा]] के बीच भेद तैयार किया जाता है, उन वस्तुओं को प्रोग्राम संभवतः नहीं पहुंच सकता है, और [[सिमेंटिक कचरा]], उन वस्तुओं का कार्यक्रम वास्तव में फिर कभी उपयोग नहीं करेगा। उदाहरण के लिए:
<syntaxhighlight lang="java">
<syntaxhighlight lang="java">
Object x = new Foo();
Object x = new Foo();
Line 28: Line 26:
System.exit(0);
System.exit(0);
</syntaxhighlight>
</syntaxhighlight>
सिमेंटिक कचरे को ठीक से पहचानने की समस्या को आसानी से [[निर्णय समस्या]] के रूप में दिखाया जा सकता है: प्रोग्राम जो ऑब्जेक्ट एक्स को आवंटित करता है, मनमाना इनपुट प्रोग्राम पी चलाता है, और एक्स का उपयोग करता है यदि और केवल यदि पी खत्म करने के लिए सिमेंटिक कचरा कलेक्टर की आवश्यकता होती है। संकट। यद्यपि सिमेंटिक कचरा पहचान के लिए रूढ़िवादी हेयुरिस्टिक तरीके सक्रिय अनुसंधान क्षेत्र बने हुए हैं, अनिवार्य रूप से सभी व्यावहारिक कचरा संग्राहक सिंटैक्टिक कचरा पर ध्यान केंद्रित करते हैं।{{Citation needed|date=September 2008}}
सिमेंटिक गार्बेज को ठीक से पहचानने की समस्या को आसानी से [[निर्णय समस्या]] के रूप में दिखाया जा सकता है: प्रोग्राम जो ऑब्जेक्ट X को आवंटित करता है, इच्छानुसार इनपुट प्रोग्राम P चलाता है, और X का उपयोग करता है यदि और केवल यदि P डिलीट करने के लिए सिमेंटिक गार्बेज संग्राहक की आवश्यकता होती है। संकट। यद्यपि सिमेंटिक गार्बेज पहचान के लिए रूढ़िवादी हेयुरिस्टिक तरीके सक्रिय अनुसंधान क्षेत्र बने हुए हैं, आदेशात्मक रूप से सभी व्यावहारिक गार्बेज संग्राहक सिंटैक्टिक गार्बेज पर ध्यान केंद्रित करते हैं।


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


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


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


कुछ कार्यान्वयनों में, कमजोर संदर्भों को उपश्रेणियों में विभाजित किया जाता है। उदाहरण के लिए, [[जावा वर्चुअल मशीन]] तीन प्रकार के कमजोर संदर्भ प्रदान करती है, अर्थात् नरम संदर्भ,<ref>{{cite web |url=http://docs.oracle.com/javase/7/docs/api/java/lang/ref/SoftReference.html |title=Class SoftReference&lt;T&gt; |publisher=Oracle |website=Java™ Platform Standard Ed.&nbsp;7 |access-date=25 May 2013}}</ref> [[प्रेत संदर्भ]],<ref>{{cite web |url=http://docs.oracle.com/javase/7/docs/api/java/lang/ref/PhantomReference.html |title=Class PhantomReference&lt;T&gt; |publisher=Oracle |website=Java™ Platform Standard Ed.&nbsp;7 |access-date=25 May 2013}}</ref> और नियमित कमजोर संदर्भ।<ref>{{cite web |url=http://docs.oracle.com/javase/7/docs/api/java/lang/ref/WeakReference.html |title=Class WeakReference&lt;T&gt; |publisher=Oracle |website=Java™ Platform Standard Ed.&nbsp;7 |access-date=25 May 2013}}</ref> नरम संदर्भित वस्तु केवल सुधार के लिए पात्र है, यदि कचरा संग्रहकर्ता यह निर्णय लेता है कि कार्यक्रम स्मृति पर कम है। नरम संदर्भ या नियमित कमजोर संदर्भ के विपरीत, प्रेत संदर्भ उस वस्तु तक पहुंच प्रदान नहीं करता है जिसे वह संदर्भित करता है। इस के अतिरिक्त, प्रेत संदर्भ तंत्र है जो कचरा संग्राहक को कार्यक्रम को सूचित करने की अनुमति देता है जब संदर्भित वस्तु प्रेत पहुंच योग्य हो जाती है। वस्तु प्रेत पहुंच योग्य है, यदि यह अभी भी स्मृति में रहता है और इसे प्रेत संदर्भ द्वारा संदर्भित किया जाता है, किन्तुइसका अंतिम रूप पहले ही निष्पादित हो चुका है। इसी तरह, .NET Framework|Microsoft.NET कमजोर संदर्भों की दो उपश्रेणियाँ प्रदान करता है,<ref>{{cite web |url=http://msdn.microsoft.com/en-us/library/ms404247.aspx |title=कमजोर संदर्भ|publisher=Microsoft |website=.NET Framework&nbsp;4.5 |access-date=25 May 2013}}</ref> अर्थात् लंबे कमजोर संदर्भ (पुनरुत्थान ट्रैक) और छोटे कमजोर संदर्भ।
कुछ कार्यान्वयनों में, अशक्त संदर्भों को उपश्रेणियों में विभाजित किया जाता है। उदाहरण के लिए, [[जावा वर्चुअल मशीन]] तीन प्रकार के अशक्त संदर्भ प्रदान करती है, अर्थात् नरम संदर्भ, <ref>{{cite web |url=http://docs.oracle.com/javase/7/docs/api/java/lang/ref/SoftReference.html |title=Class SoftReference&lt;T&gt; |publisher=Oracle |website=Java™ Platform Standard Ed.&nbsp;7 |access-date=25 May 2013}}</ref> [[प्रेत संदर्भ|फैंटम रिफरेन्स]],<ref>{{cite web |url=http://docs.oracle.com/javase/7/docs/api/java/lang/ref/PhantomReference.html |title=Class PhantomReference&lt;T&gt; |publisher=Oracle |website=Java™ Platform Standard Ed.&nbsp;7 |access-date=25 May 2013}}</ref> और नियमित अशक्त संदर्भ।<ref>{{cite web |url=http://docs.oracle.com/javase/7/docs/api/java/lang/ref/WeakReference.html |title=Class WeakReference&lt;T&gt; |publisher=Oracle |website=Java™ Platform Standard Ed.&nbsp;7 |access-date=25 May 2013}}</ref> नरम संदर्भित ऑब्जेक्ट केवल सुधार के लिए पात्र है, यदि गार्बेज संग्रहकर्ता यह निर्णय लेता है कि प्रोग्राम मेमोरी पर कम है। नरम संदर्भ या नियमित अशक्त संदर्भ के विपरीत, फैंटम रिफरेन्स उस ऑब्जेक्ट तक पहुंच प्रदान नहीं करता है जिसे वह संदर्भित करता है। इस के अतिरिक्त, फैंटम रिफरेन्स तंत्र है जो गार्बेज संग्राहक को प्रोग्राम को सूचित करने की अनुमति देता है जब संदर्भित ऑब्जेक्ट फैंटम पहुंच योग्य हो जाती है। ऑब्जेक्ट फैंटम पहुंच योग्य है, यदि यह अभी भी मेमोरी में रहता है और इसे फैंटम रिफरेन्स द्वारा संदर्भित किया जाता है, किन्तुइसका अंतिम रूप पहले ही निष्पादित हो चुका है। इसी तरह, .नेट फ्रेमवर्क| माइक्रोसॉफ्ट.नेट अशक्त संदर्भों की दो उपश्रेणियाँ प्रदान करता है,<ref>{{cite web |url=http://msdn.microsoft.com/en-us/library/ms404247.aspx |title=कमजोर संदर्भ|publisher=Microsoft |website=.NET Framework&nbsp;4.5 |access-date=25 May 2013}}</ref> अर्थात् लंबे अशक्त संदर्भ (पुनरुत्थान ट्रैक) और छोटे अशक्त संदर्भ है ।


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


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


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


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


=== भोली मार्क-एंड-स्वीप ===
=== नैवे मार्क-एंड-स्वीप ===
[[File:Animation of the Naive Mark and Sweep Garbage Collector Algorithm.gif|thumb|upright=1.5|डायनेमिक मेमोरी एलोकेशन # मैनुअल मेमोरी मैनेजमेंट युक्त आठ ऑब्जेक्ट (कंप्यूटर साइंस) पर कार्रवाई में नैव मार्क-एंड-स्वीप। तीर वस्तु उन्मुख भाषाओं में संदर्भ (कंप्यूटर विज्ञान)#References का प्रतिनिधित्व करते हैं। वृत्त स्वयं वस्तुओं का प्रतिनिधित्व करते हैं। ऑब्जेक्ट #1, #2, #3, #4, और #6 रूट सेट से दृढ़ता से संदर्भित हैं। दूसरी ओर, वस्तुओं #5, #7, और #8 को रूट सेट से प्रत्यक्ष या अप्रत्यक्ष रूप से दृढ़ता से संदर्भित नहीं किया जाता है; इसलिए, वे कचरा हैं।]]भोली मार्क-एंड-स्वीप विधि में, स्मृति में प्रत्येक वस्तु में ध्वज (आमतौर पर एक बिट) होता है जो केवल कचरा संग्रहण उपयोग के लिए आरक्षित होता है। संग्रह चक्र को छोड़कर, यह ध्वज सदैव साफ़ किया जाता है।
[[File:Animation of the Naive Mark and Sweep Garbage Collector Algorithm.gif|thumb|upright=1.5|डायनेमिक मेमोरी एलोकेशन # मैनुअल मेमोरी प्रबंध युक्त आठ ऑब्जेक्ट (कंप्यूटर साइंस) पर कार्रवाई में नैव मार्क-एंड-स्वीप। तीर ऑब्जेक्ट उन्मुख भाषाओं में संदर्भ (कंप्यूटर विज्ञान)#संदर्भ का प्रतिनिधित्व करते हैं। वृत्त स्वयं ऑब्जेक्ट का प्रतिनिधित्व करते हैं। ऑब्जेक्ट #1, #2, #3, #4, और #6 रूट सेट से दृढ़ता से संदर्भित हैं। दूसरी ओर, ऑब्जेक्ट #5, #7, और #8 को रूट सेट से प्रत्यक्ष या अप्रत्यक्ष रूप से दृढ़ता से संदर्भित नहीं किया जाता है; इसलिए, वे गार्बेज हैं।]]नैवे मार्क-एंड-स्वीप विधि में, मेमोरी में प्रत्येक ऑब्जेक्ट में ध्वज (सामान्यतः एक बिट) होता है जो केवल गार्बेज संग्रहण उपयोग के लिए आरक्षित होता है। संग्रह चक्र को छोड़कर, यह ध्वज सदैव साफ़ किया जाता है।


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


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


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


=== {{Anchor|TRI-COLOR}}तिरंगा अंकन ===
=== त्रि-रंग अंकन ===
[[File:Animation of tri-color garbage collection.gif|thumb|upright=1.5|8 वस्तुओं के ढेर पर तिरंगा अंकन का उदाहरण।
[[File:Animation of tri-color garbage collection.gif|thumb|upright=1.5|8 ऑब्जेक्ट के हीप पर त्रि-रंग अंकन का उदाहरण।सफेद, ग्रे और काली ऑब्जेक्ट को क्रमशः हल्के-ग्रे, पीले और नीले रंग से दर्शाया जाता है।]]इन प्रदर्शन समस्याओं के कारण, अधिकांश आधुनिक अनुरेखण गार्बेज संग्रहकर्ता त्रि-रंग अंकन अमूर्तता (कंप्यूटर विज्ञान) के कुछ प्रकार को प्रयुक्त करते हैं, किन्तुसाधारण संग्राहक (जैसे मार्क-एंड-स्वीप संग्राहक) अधिकांशतः इस अमूर्तता को स्पष्ट नहीं करते हैं। त्रि-रंग अंकन नीचे बताए अनुसार काम करता है।
सफेद, ग्रे और काली वस्तुओं को क्रमशः हल्के-ग्रे, पीले और नीले रंग से दर्शाया जाता है।]]इन प्रदर्शन समस्याओं के कारण, अधिकांश आधुनिक अनुरेखण कचरा संग्रहकर्ता त्रि-रंग अंकन अमूर्तता (कंप्यूटर विज्ञान) के कुछ प्रकार को प्रयुक्त करते हैं, किन्तुसाधारण संग्राहक (जैसे मार्क-एंड-स्वीप कलेक्टर) अधिकांशतः इस अमूर्तता को स्पष्ट नहीं करते हैं। तिरंगा अंकन नीचे बताए अनुसार काम करता है।


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


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


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


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


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


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


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


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


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


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


मूविंग गार्बेज कलेक्टर का हानि यह है कि यह केवल उन संदर्भों के माध्यम से एक्सेस की अनुमति देता है जो कचरा एकत्र वातावरण द्वारा प्रबंधित होते हैं, और पॉइंटर अंकगणित की अनुमति नहीं देते हैं। ऐसा इसलिए है क्योंकि कचरा संग्रहकर्ता उन वस्तुओं को स्थानांतरित करता है (वे झूलने वाले संकेत बन जाते हैं) तो वस्तुओं के किसी भी संकेत को अमान्य कर दिया जाएगा। मूल कोड के साथ [[ अंतर |अंतर]] के लिए, कचरा संग्रहकर्ता को ऑब्जेक्ट सामग्री को स्मृति के कचरा एकत्रित क्षेत्र के बाहर किसी स्थान पर कॉपी करना होगा। ऑब्जेक्ट को स्मृति में पिन करने का वैकल्पिक प्रणाली है, कचरा कलेक्टर को इसे स्थानांतरित करने से रोकना और स्मृति को सीधे देशी पॉइंटर्स (और संभवतः सूचक अंकगणितीय अनुमति) के साथ साझा करने की अनुमति देना है।<ref>{{cite web |url=https://docs.microsoft.com/en-us/dotnet/framework/interop/copying-and-pinning |title=कॉपी करना और पिन करना|work=[[Microsoft Docs]] |access-date=2022-04-25}}</ref>
मूविंग गार्बेज संग्राहक का हानि यह है कि यह केवल उन संदर्भों के माध्यम से एक्सेस की अनुमति देता है जो गार्बेज एकत्र वातावरण द्वारा प्रबंधित होते हैं, और पॉइंटर अंकगणित की अनुमति नहीं देते हैं। ऐसा इसलिए है क्योंकि गार्बेज संग्रहकर्ता उन ऑब्जेक्ट को स्थानांतरित करता है (वे झूलने वाले संकेत बन जाते हैं) तो ऑब्जेक्ट के किसी भी संकेत को अमान्य कर दिया जाएगा। मूल कोड के साथ [[ अंतर |अंतर]] के लिए, गार्बेज संग्रहकर्ता को ऑब्जेक्ट सामग्री को मेमोरी के गार्बेज एकत्रित क्षेत्र के बाहर किसी स्थान पर प्रतिलिपि करना होगा। ऑब्जेक्ट को मेमोरी में पिन करने का वैकल्पिक प्रणाली है, गार्बेज संग्राहक को इसे स्थानांतरित करने से रोकना और मेमोरी को सीधे देशी पॉइंटर्स (और संभवतः सूचक अंकगणितीय अनुमति) के साथ साझा करने की अनुमति देना है।<ref>{{cite web |url=https://docs.microsoft.com/en-us/dotnet/framework/interop/copying-and-pinning |title=कॉपी करना और पिन करना|work=[[Microsoft Docs]] |access-date=2022-04-25}}</ref>
 
=== प्रतिलिपिकरण बनाम मार्क-एंड-स्वीप बनाम मार्क-एंड-नॉट-स्वीप ===
 
=== कॉपी करना बनाम मार्क-एंड-स्वीप बनाम मार्क-एंड-नॉट-स्वीप ===
संग्राहक न केवल इस बात में भिन्न होते हैं कि वे चल रहे हैं या गैर-चल रहे हैं, उन्हें यह भी वर्गीकृत किया जा सकता है कि वे संग्रह चक्र के समयसफेद, ग्रे और काले ऑब्जेक्ट सेट का इलाज कैसे करते हैं।
संग्राहक न केवल इस बात में भिन्न होते हैं कि वे चल रहे हैं या गैर-चल रहे हैं, उन्हें यह भी वर्गीकृत किया जा सकता है कि वे संग्रह चक्र के समयसफेद, ग्रे और काले ऑब्जेक्ट सेट का इलाज कैसे करते हैं।


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


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


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


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


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


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


=== जनरेशनल जीसी (अल्पकालिक जीसी) ===
=== जनरेशनल जीसी (अल्पकालिक जीसी) ===
यह अनुभवजन्य रूप से देखा गया है कि कई कार्यक्रमों में, सबसे हाल ही में बनाई गई वस्तुएँ भी ऐसी होती हैं जिनके जल्दी से अगम्य होने की संभावना होती है (शिशु मृत्यु दर या पीढ़ीगत ता है)। <!--
यह अनुभवजन्य रूप से देखा गया है कि कई प्रोग्रामों में, सबसे वर्तमान समय में बनाई गई वस्तुएँ भी ऐसी होती हैं जिनके जल्दी से अगम्य होने की संभावना होती है (शिशु मृत्यु दर या पीढ़ीगत ता है)। पीढ़ीगत जीसी (जिसे अल्पकालिक जीसी के रूप में भी जाना जाता है) ऑब्जेक्ट को पीढ़ियों में विभाजित करता है और, अधिकांश चक्रों पर, केवल पीढ़ियों के सबसमुच्चय की ऑब्जेक्ट को प्रारंभिक सफेद (निंदा) सेट में रखेगा। इसके अतिरिक्त, रनटाइम प्रणाली संदर्भों के निर्माण और ओवरराइटिंग को देखकर संदर्भ पीढ़ी पीढ़ी के संदर्भों के ज्ञान को बनाए रखता है। जब गार्बेज संग्राहक चलता है, तो यह इस ज्ञान का उपयोग यह सिद्ध करने में सक्षम हो सकता है कि प्रारंभिकुआती सफेद सेट में कुछ वस्तुएं पूरे संदर्भ पेड़ को पार किए बिना पहुंच से बाहर हैं। यदि पीढ़ीगत परिकल्पना धारण करती है, तो इसके परिणामस्वरूप सबसे अधिक अप्राप्य ऑब्जेक्ट को पुनः प्राप्त करते हुए बहुत तेज़ संग्रह चक्र होते हैं।
the following sentence is embarrassing without a reference, someone please find one


Experimental evidence shows that around 90% of objects die before their first garbage collection. --> पीढ़ीगत जीसी (जिसे अल्पकालिक जीसी के रूप में भी जाना जाता है) वस्तुओं को पीढ़ियों में विभाजित करता है और, अधिकांश चक्रों पर, केवल पीढ़ियों के सबसेट की वस्तुओं को प्रारंभिक सफेद (निंदा) सेट में रखेगा। इसके अतिरिक्त, रनटाइम प्रणाली संदर्भों के निर्माण और ओवरराइटिंग को देखकर संदर्भ पीढ़ी पीढ़ी के संदर्भों के ज्ञान को बनाए रखता है। जब कचरा संग्राहक चलता है, तो यह इस ज्ञान का उपयोग यह सिद्ध करने में सक्षम हो सकता है कि प्रारंभिकुआती सफेद सेट में कुछ वस्तुएं पूरे संदर्भ पेड़ को पार किए बिना पहुंच से बाहर हैं। यदि पीढ़ीगत परिकल्पना धारण करती है, तो इसके परिणामस्वरूप सबसे अधिक अप्राप्य वस्तुओं को पुनः प्राप्त करते हुए बहुत तेज़ संग्रह चक्र होते हैं।
इस अवधारणा को प्रयुक्त करने के लिए, कई पीढ़ीगत गार्बेज संग्राहक विभिन्न आयु की ऑब्जेक्ट के लिए अलग-अलग मेमोरी क्षेत्रों का उपयोग करते हैं। जब कोई क्षेत्र पूर्ण हो जाता है, तो पुरानी पीढ़ी(यों) के संदर्भों को रूट के रूप में उपयोग करते हुए, इसमें उपस्थित ऑब्जेक्ट का पता लगाया जाता है। यह सामान्यतः पीढ़ी में अधिकांश ऑब्जेक्ट को एकत्र किया जाता है (परिकल्पना द्वारा), इसे नई ऑब्जेक्ट को आवंटित करने के लिए उपयोग करने के लिए छोड़ दिया जाता है। जब संग्रह कई ऑब्जेक्ट को एकत्र नहीं करता है (उदाहरण के लिए परिकल्पना पकड़ में नहीं आती है, क्योंकि प्रोग्राम ने नई ऑब्जेक्ट के बड़े संग्रह की गणना की है जिसे वह बनाए रखना चाहता है), कुछ या सभी जीवित वस्तुएँ जो पुरानी मेमोरी से संदर्भित हैं क्षेत्रों को अगले उच्चतम क्षेत्र में पदोन्नत किया जाता है, और फिर पूरे क्षेत्र को ताज़ा ऑब्जेक्ट के साथ अधिलेखित किया जा सकता है। यह विधि बहुत तेजी से वृद्धिशील ट्रेसिंग गार्बेज की अनुमति देती है, क्योंकि एक समय में केवल क्षेत्र का ट्रेसिंग गार्बेज सामान्यतः आवश्यक होता है।


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


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


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


इसका हानि यह है कि संग्रह चक्र चलने के समयकार्यक्रम कोई उपयोगी कार्य नहीं कर सकता है (कभी-कभी शर्मनाक ठहराव कहा जाता है)<ref>{{cite journal |last1=Steele |first1=Guy L. |author-link=Guy L. Steele Jr. |title=मल्टीप्रोसेसिंग कॉम्पैक्टिंग कचरा संग्रह|journal=Communications of the ACM |date=September 1975 |volume=18 |issue=9 |pages=495–508 |doi=10.1145/361002.361005 |doi-access=free |s2cid=29412244}}</ref>). स्टॉप-द-वर्ल्ड कचरा संग्रह इसलिए मुख्य रूप से गैर-संवादात्मक कार्यक्रमों के लिए उपयुक्त है। इसका लाभ यह है कि इसे प्रयुक्त करना आसान है और वृद्धिशील कचरा संग्रहण की तुलना में तेज़ है।
इसका हानि यह है कि संग्रह चक्र चलने के समयप्रोग्राम कोई उपयोगी कार्य नहीं कर सकता है (कभी-कभी शर्मनाक ठहराव कहा जाता है)<ref>{{cite journal |last1=Steele |first1=Guy L. |author-link=Guy L. Steele Jr. |title=मल्टीप्रोसेसिंग कॉम्पैक्टिंग कचरा संग्रह|journal=Communications of the ACM |date=September 1975 |volume=18 |issue=9 |pages=495–508 |doi=10.1145/361002.361005 |doi-access=free |s2cid=29412244}}</ref>). स्टॉप-द-वर्ल्ड ट्रेसिंग गार्बेज इसलिए मुख्य रूप से गैर-संवादात्मक प्रोग्रामों के लिए उपयुक्त है। इसका लाभ यह है कि इसे प्रयुक्त करना आसान है और वृद्धिशील गार्बेज संग्रहण की तुलना में तेज़ है।


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


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


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


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


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


थ्रूपुट के संदर्भ में, इसकी प्रकृति से अनुरेखण के लिए कुछ निहित रनटाइम [[कम्प्यूटेशनल ओवरहेड]] की आवश्यकता होती है, चूंकि कुछ मामलों में परिशोधित निवेश अत्यधिक कम हो सकती है, कुछ मामलों में प्रति आवंटन या संग्रह के निर्देश से भी कम, स्टैक आवंटन से उत्तम प्रदर्शन।<ref>{{cite journal |last=Appel |first=Andrew W. |author-link=Andrew Appel |date=1987-06-17 |df=mdy |title=ढेर आवंटन की तुलना में कचरा संग्रह तेजी से हो सकता है|journal=Information Processing Letters |volume=25 |issue=4 |pages=275–279 |citeseerx=10.1.1.49.2537 |doi=10.1016/0020-0190(87)90175-X |s2cid=2575400 |url=https://www.cs.princeton.edu/~appel/papers/45.pdf |access-date=2022-04-25}}</ref> मैन्युअल मेमोरी प्रबंधन के लिए मेमोरी को स्पष्ट रूप से मुक्त करने के कारण ओवरहेड की आवश्यकता होती है, और रेफरेंस काउंटिंग में इन्क्रीमेंटिंग और डिक्रिमेंटिंग रेफरेंस काउंट्स से ओवरहेड होता है, और यह चेक करता है कि काउंट ओवरफ्लो हो गया है या शून्य हो गया है। {{Citation needed|date=February 2020}}
थ्रूपुट के संदर्भ में, इसकी प्रकृति से अनुरेखण के लिए कुछ निहित रनटाइम [[कम्प्यूटेशनल ओवरहेड]] की आवश्यकता होती है, चूंकि कुछ मामलों में परिशोधित निवेश अत्यधिक कम हो सकती है, कुछ मामलों में प्रति आवंटन या संग्रह के निर्देश से भी कम, स्टैक आवंटन से उत्तम प्रदर्शन।<ref>{{cite journal |last=Appel |first=Andrew W. |author-link=Andrew Appel |date=1987-06-17 |df=mdy |title=ढेर आवंटन की तुलना में कचरा संग्रह तेजी से हो सकता है|journal=Information Processing Letters |volume=25 |issue=4 |pages=275–279 |citeseerx=10.1.1.49.2537 |doi=10.1016/0020-0190(87)90175-X |s2cid=2575400 |url=https://www.cs.princeton.edu/~appel/papers/45.pdf |access-date=2022-04-25}}</ref> मैन्युअल मेमोरी प्रबंधन के लिए मेमोरी को स्पष्ट रूप से मुक्त करने के कारण ओवरहेड की आवश्यकता होती है, और रेफरेंस काउंटिंग में इन्क्रीमेंटिंग और डिक्रिमेंटिंग रेफरेंस काउंट्स से ओवरहेड होता है, और यह चेक करता है कि काउंट ओवरफ्लो हो गया है या शून्य हो गया है।  


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


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


; कचरा संग्रहण:
==== गार्बेज संग्रहण ====
* पहुंच योग्य वस्तुओं का पता लगाएं
* पहुंच योग्य ऑब्जेक्ट का पता लगाएं
* मूविंग कलेक्टर्स के लिए रीचेबल ऑब्जेक्ट्स को कॉपी करें
* मूविंग संग्राहक्स के लिए रीचेबल ऑब्जेक्ट को प्रतिलिपि करें
* वृद्धिशील संग्राहकों के लिए अवरोध पढ़ें/लिखें
* वृद्धिशील संग्राहकों के लिए अवरोध पढ़ें/लिखें
* बेस्ट/फर्स्ट-फिट ब्लॉक की तलाश करें और नॉन-मूविंग कलेक्टर्स के लिए फ्री लिस्ट मेंटेनेंस करें
* बेस्ट/फर्स्ट-फिट ब्लॉक की तलाश करें और नॉन-मूविंग संग्राहक्स के लिए फ्री लिस्ट मेंटेनेंस करें
 
दो मामलों की सीधे तुलना करना जटिल है, क्योंकि उनका व्यवहार स्थिति पर निर्भर करता है। उदाहरण के लिए, ट्रेसिंग गार्बेज प्रणाली के लिए सबसे अच्छे स्तिथि में, आवंटन केवल सूचक को बढ़ाता है, किन्तुमैन्युअल हीप आवंटन के लिए सबसे अच्छे स्तिथि में, आवंटक विशिष्ट आकारों के फ्रीलिस्ट को बनाए रखता है और आवंटन के लिए केवल सूचक का अनुसरण करने की आवश्यकता होती है। चूंकि, यह आकार अलगाव सामान्यतः बाहरी विखंडन की बड़ी मात्रा का कारण बनता है, जो कैश व्यवहार पर प्रतिकूल प्रभाव डाल सकता है। गार्बेज एकत्रित भाषा में मेमोरी आवंटन दृश्यों के पीछे हीप आवंटन का उपयोग करके प्रयुक्त किया जा सकता है (केवल सूचक को बढ़ाने के अतिरिक्त), इसलिए ऊपर सूचीबद्ध प्रदर्शन लाभ इस स्तिथि में आवश्यक रूप से प्रयुक्त नहीं होते हैं। कुछ स्थितियों में, सबसे विशेष रूप से [[ अंतः स्थापित प्रणाली |एम्बेडेड सिस्टम]] , मेमोरी के पूर्व-आवंटन पूल और आवंटन/डीललोकेशन के लिए कस्टम, लाइटवेट योजना का उपयोग करके ट्रेसिंग गार्बेज और हीप प्रबंधन ओवरहेड दोनों से बचना संभव है।<ref>{{cite mailing list |last=Hopwood |first=David |date=2007-01-01 |df=mdy |title=एम्बेडेड सिस्टम में मेमोरी आवंटन|mailing-list=cap-talk |publisher=[[EROS (microkernel)|EROS]] |url=http://www.eros-os.org/pipermail/cap-talk/2007-January/006795.html |archive-url=https://web.archive.org/web/20150924001857/http://www.eros-os.org/pipermail/cap-talk/2007-January/006795.html |archive-date=2015-09-24}}</ref>


दो मामलों की सीधे तुलना करना जटिल है, क्योंकि उनका व्यवहार स्थिति पर निर्भर करता है। उदाहरण के लिए, कचरा संग्रह प्रणाली के लिए सबसे अच्छे मामले में, आवंटन केवल सूचक को बढ़ाता है, किन्तुमैन्युअल हीप आवंटन के लिए सबसे अच्छे मामले में, आवंटक विशिष्ट आकारों के फ्रीलिस्ट को बनाए रखता है और आवंटन के लिए केवल सूचक का अनुसरण करने की आवश्यकता होती है। चूंकि, यह आकार अलगाव आमतौर पर बाहरी विखंडन की बड़ी मात्रा का कारण बनता है, जो कैश व्यवहार पर प्रतिकूल प्रभाव डाल सकता है। कचरा एकत्रित भाषा में स्मृति आवंटन दृश्यों के पीछे हीप आवंटन का उपयोग करके प्रयुक्त किया जा सकता है (केवल सूचक को बढ़ाने के अतिरिक्त), इसलिए ऊपर सूचीबद्ध प्रदर्शन लाभ इस मामले में आवश्यक रूप से प्रयुक्त नहीं होते हैं। कुछ स्थितियों में, सबसे विशेष रूप से [[ अंतः स्थापित प्रणाली |अंतः स्थापित प्रणाली]] , मेमोरी के पूर्व-आवंटन पूल और आवंटन/डीललोकेशन के लिए कस्टम, लाइटवेट योजना का उपयोग करके कचरा संग्रह और हीप प्रबंधन ओवरहेड दोनों से बचना संभव है।<ref>{{cite mailing list |last=Hopwood |first=David |date=2007-01-01 |df=mdy |title=एम्बेडेड सिस्टम में मेमोरी आवंटन|mailing-list=cap-talk |publisher=[[EROS (microkernel)|EROS]] |url=http://www.eros-os.org/pipermail/cap-talk/2007-January/006795.html |archive-url=https://web.archive.org/web/20150924001857/http://www.eros-os.org/pipermail/cap-talk/2007-January/006795.html |archive-date=2015-09-24}}</ref>
[[अनिवार्य प्रोग्रामिंग|आदेशात्मक प्रोग्रामिंग]]-शैली प्रोग्राम में लिखने की बाधाओं के ऊपरी भाग को ध्यान देने योग्य होने की अधिक संभावना है, जो [[कार्यात्मक प्रोग्रामिंग]]-शैली प्रोग्राम की तुलना में आधुनिक डेटा संरचनाओं में पॉइंटर्स लिखता है जो केवल एक बार डेटा बनाता है और उन्हें कभी नहीं बदलता है।
एक [[अनिवार्य प्रोग्रामिंग]]-शैली कार्यक्रम में लिखने की बाधाओं के ऊपरी भाग को ध्यान देने योग्य होने की अधिक संभावना है, जो [[कार्यात्मक प्रोग्रामिंग]]-शैली प्रोग्राम की तुलना में आधुनिक डेटा संरचनाओं में पॉइंटर्स लिखता है जो केवल एक बार डेटा बनाता है और उन्हें कभी नहीं बदलता है।


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


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


== रीयल-टाइम कचरा संग्रह ==
जबकि ट्रेसिंग गार्बेज सामान्यतः गैर-नियतात्मक होता है, इसका उपयोग हार्ड रीयल-टाइम कंप्यूटिंग | रीयल-टाइम प्रणाली में करना संभव है। वास्तविक समय गार्बेज संग्राहक को यह गारंटी देनी चाहिए कि सबसे खराब स्थिति में भी यह निश्चित संख्या में कम्प्यूटेशनल संसाधनों को म्यूटेटर थ्रेड्स को समर्पित करेगा। रीयल-टाइम गार्बेज संग्राहक पर लगाए गए प्रतिबंध सामान्यतः या तो कार्य-आधारित या समय-आधारित होते हैं। एक समय आधारित बाधा इस तरह दिखेगी: अवधि टी की प्रत्येक समय खिड़की के अंदर, म्यूटेटर थ्रेड्स को कम से कम टीएम समय के लिए चलने की अनुमति दी जानी चाहिए। कार्य आधारित विश्लेषण के लिए, एमएमयू (न्यूनतम म्यूटेटर उपयोग)<ref>{{cite journal |first1=Perry |last1=Cheng |first2=Guy E. |last2=Blelloch |date=2001-06-22  |df=mdy |title=एक समानांतर, रीयल-टाइम कचरा संग्राहक|journal=ACM SIGPLAN Notices |volume=36 |issue=5 |pages=125–136 |doi=10.1145/381694.378823 |url=http://www.aladdin.cs.cmu.edu/papers/pdfs/y2001/rtg.pdf}}</ref> सामान्यतः गार्बेज संग्रहण एल्गोरिथ्म विधि के लिए रीयल-टाइम बाधा के रूप में उपयोग किया जाता है।


जबकि कचरा संग्रह सामान्यतः गैर-नियतात्मक होता है, इसका उपयोग हार्ड रीयल-टाइम कंप्यूटिंग | रीयल-टाइम प्रणाली में करना संभव है। वास्तविक समय कचरा संग्राहक को यह गारंटी देनी चाहिए कि सबसे खराब स्थिति में भी यह निश्चित संख्या में कम्प्यूटेशनल संसाधनों को म्यूटेटर थ्रेड्स को समर्पित करेगा। रीयल-टाइम कचरा संग्राहक पर लगाए गए प्रतिबंध आमतौर पर या तो कार्य-आधारित या समय-आधारित होते हैं। एक समय आधारित बाधा इस तरह दिखेगी: अवधि टी की प्रत्येक समय खिड़की के अंदर, म्यूटेटर थ्रेड्स को कम से कम टीएम समय के लिए चलने की अनुमति दी जानी चाहिए। कार्य आधारित विश्लेषण के लिए, एमएमयू (न्यूनतम म्यूटेटर उपयोग)<ref>{{cite journal |first1=Perry |last1=Cheng |first2=Guy E. |last2=Blelloch |date=2001-06-22 |df=mdy |title=एक समानांतर, रीयल-टाइम कचरा संग्राहक|journal=ACM SIGPLAN Notices |volume=36 |issue=5 |pages=125–136 |doi=10.1145/381694.378823 |url=http://www.aladdin.cs.cmu.edu/papers/pdfs/y2001/rtg.pdf}}</ref> आमतौर पर कचरा संग्रहण एल्गोरिदम के लिए रीयल-टाइम बाधा के रूप में उपयोग किया जाता है।
[[जेवीएम]] के लिए [[कठिन वास्तविक समय]] ट्रेसिंग गार्बेज के पहले कार्यान्वयन में से [[मेट्रोनोम एल्गोरिथ्म]] पर आधारित था,<ref>{{cite conference |last1=Bacon |first1=David F. |last2=Cheng |first2=Perry |last3=Rajan |first3=V. T. |date=November 2003 |title=The Metronome: A Simpler Approach to Garbage Collection in Real-Time Systems |editor-last1=Corsaro |editor-first1=Angelo |editor-last2=Cytron |editor-first2=Ron |editor-last3=Santoro |editor-first3=Corrado |book-title=Workshop on Java Technologies for Real-Time and Embedded Systems |department=JTRES'03 |conference=OTM 2003 Workshops |work=On The Move to Meaningful Internet Systems 2003 |series=[[Lecture Notes in Computer Science|LNCS]] |volume=2889 |pages=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 |url=http://www.research.ibm.com/people/d/dfb/papers/Bacon03Metronome.pdf |archive-url=https://web.archive.org/web/20061026215158/http://www.research.ibm.com/people/d/dfb/papers/Bacon03Metronome.pdf |archive-date=2006-10-26}}</ref> जिसका व्यावसायिक कार्यान्वयन [[IBM WebSphere Real Time|आईबीएम वेबस्फेयर रियल टाइम]] के भाग के रूप में उपलब्ध है।<ref>{{cite web |last1=Biron |first1=Benjamin |last2=Sciampacone |first2=Ryan |date=2007-05-02 |df=mdy |title=Real-time Java, Part 4: Real-time garbage collection |work=[[IBM DeveloperWorks]] |url=http://www.ibm.com/developerworks/java/library/j-rtj4/index.html |archive-url=https://web.archive.org/web/20201109040826/http://www.ibm.com/developerworks/java/library/j-rtj4/index.html |archive-date=2020-11-09}}</ref> अन्य कठिन रीयल-टाइम ट्रेसिंग गार्बेज एल्गोरिथ्म स्टैकाटो है, जो [[आईबीएम]] के [[आईबीएम जे 9]] में उपलब्ध है, जो मेट्रोनोम और अन्य एल्गोरिथ्म विधि पर विभिन्न फायदे लाते हुए बड़े मल्टीप्रोसेसर आर्किटेक्वेरिएबल्स को स्केलेबिलिटी प्रदान करता है, इसके विपरीत, विशेष हार्डवेयर की आवश्यकता होती है।<ref>{{cite techreport |last1=McCloskey |first1=Bill |last2=Bacon |first2=David F. |last3=Cheng |first3=Perry |last4=Grove |first4=David |date=2008-02-22 |df=mdy |title=Staccato: A Parallel and Concurrent Real-time Compacting Garbage Collector for Multiprocessors |institution=IBM Research Division |number=RC24504 |url=https://dominoweb.draco.res.ibm.com/reports/rc24504.pdf |access-date=2022-04-25}}</ref>
 
आधुनिक मल्टी-कोर आर्किटेक्वेरिएबल्स पर रीयल-टाइम ट्रेसिंग गार्बेज के लिए बड़ी चुनौती गैर-अवरुद्ध समवर्ती ट्रेसिंग गार्बेज को डिजाइन करने में है, जो समवर्ती धागे को एक-दूसरे को अवरुद्ध नहीं करने देता है और अप्रत्याशित विराम उत्पन्न करता है। एल्गोरिथ्म विधि का अध्ययन जो गैर-अवरुद्ध रीयल-टाइम समवर्ती ट्रेसिंग गार्बेज की अनुमति देता है, माइक्रोसॉफ्ट रिसर्च में पिज़लो एट अल द्वारा पेपर में दिखाई देता है।<ref>{{cite conference |last1=Pizlo |first1=Phil |last2=Petrank |first2=Erez |last3=Steensgaard |first3=Bjarne |date=June 2008 |title=Proceedings of the 29th ACM SIGPLAN Conference on Programming Language Design and Implementation | conference=PLDI 2008 Conferenece | pages=33–44 |citeseerx=10.1.1.3.8544 |doi=10.1145/1375581.1375587 |isbn= 9781595938602 | url=http://www.cs.technion.ac.il/~erez/Papers/real-time-pldi.pdf }}</ref>


[[जेवीएम]] के लिए [[कठिन वास्तविक समय]] कचरा संग्रह के पहले कार्यान्वयन में से [[मेट्रोनोम एल्गोरिथ्म]] पर आधारित था,<ref>{{cite conference |last1=Bacon |first1=David F. |last2=Cheng |first2=Perry |last3=Rajan |first3=V. T. |date=November 2003 |title=The Metronome: A Simpler Approach to Garbage Collection in Real-Time Systems |editor-last1=Corsaro |editor-first1=Angelo |editor-last2=Cytron |editor-first2=Ron |editor-last3=Santoro |editor-first3=Corrado |book-title=Workshop on Java Technologies for Real-Time and Embedded Systems |department=JTRES'03 |conference=OTM 2003 Workshops |work=On The Move to Meaningful Internet Systems 2003 |series=[[Lecture Notes in Computer Science|LNCS]] |volume=2889 |pages=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 |url=http://www.research.ibm.com/people/d/dfb/papers/Bacon03Metronome.pdf |archive-url=https://web.archive.org/web/20061026215158/http://www.research.ibm.com/people/d/dfb/papers/Bacon03Metronome.pdf |archive-date=2006-10-26}}</ref> जिसका व्यावसायिक कार्यान्वयन [[IBM WebSphere Real Time]] के हिस्से के रूप में उपलब्ध है।<ref>{{cite web |last1=Biron |first1=Benjamin |last2=Sciampacone |first2=Ryan |date=2007-05-02 |df=mdy |title=Real-time Java, Part 4: Real-time garbage collection |work=[[IBM DeveloperWorks]] |url=http://www.ibm.com/developerworks/java/library/j-rtj4/index.html |archive-url=https://web.archive.org/web/20201109040826/http://www.ibm.com/developerworks/java/library/j-rtj4/index.html |archive-date=2020-11-09}}</ref> अन्य कठिन रीयल-टाइम कचरा संग्रह एल्गोरिथ्म स्टैकाटो है, जो [[आईबीएम]] के [[आईबीएम जे 9]] में उपलब्ध है, जो मेट्रोनोम और अन्य एल्गोरिदम पर विभिन्न फायदे लाते हुए बड़े मल्टीप्रोसेसर आर्किटेक्चर को स्केलेबिलिटी प्रदान करता है, इसके विपरीत, विशेष हार्डवेयर की आवश्यकता होती है।<ref>{{cite techreport |last1=McCloskey |first1=Bill |last2=Bacon |first2=David F. |last3=Cheng |first3=Perry |last4=Grove |first4=David |date=2008-02-22 |df=mdy |title=Staccato: A Parallel and Concurrent Real-time Compacting Garbage Collector for Multiprocessors |institution=IBM Research Division |number=RC24504 |url=https://dominoweb.draco.res.ibm.com/reports/rc24504.pdf |access-date=2022-04-25}}</ref>
आधुनिक मल्टी-कोर आर्किटेक्चर पर रीयल-टाइम कचरा संग्रह के लिए बड़ी चुनौती गैर-अवरुद्ध समवर्ती कचरा संग्रह को डिजाइन करने में है, जो समवर्ती धागे को एक-दूसरे को अवरुद्ध नहीं करने देता है और अप्रत्याशित विराम उत्पन्न करता है। एल्गोरिदम का अध्ययन जो गैर-अवरुद्ध रीयल-टाइम समवर्ती कचरा संग्रह की अनुमति देता है, पिज़लो एट अल द्वारा पेपर में दिखाई देता है। माइक्रोसॉफ्ट रिसर्च में।<ref>{{cite conference |last1=Pizlo |first1=Phil |last2=Petrank |first2=Erez |last3=Steensgaard |first3=Bjarne |date=June 2008 |title=Proceedings of the 29th ACM SIGPLAN Conference on Programming Language Design and Implementation | conference=PLDI 2008 Conferenece |  pages=33–44 |citeseerx=10.1.1.3.8544 |doi=10.1145/1375581.1375587 |isbn= 9781595938602 | url=http://www.cs.technion.ac.il/~erez/Papers/real-time-pldi.pdf }}</ref>




Line 174: Line 169:
{{Reflist|30em}}
{{Reflist|30em}}


{{Memory management}}[[Category: स्वचालित स्मृति प्रबंधन]]
[[Category: Machine Translated Page]]
[[Category:Created On 24/02/2023]]
[[Category:Created On 24/02/2023]]
[[Category:Machine Translated Page]]
[[Category:Pages with script errors]]
[[Category:Templates Vigyan Ready]]
[[Category:स्वचालित स्मृति प्रबंधन]]

Latest revision as of 15:32, 13 September 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] अर्थात् लंबे अशक्त संदर्भ (पुनरुत्थान ट्रैक) और छोटे अशक्त संदर्भ है ।

अशक्त संग्रह

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

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

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

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

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

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

डायनेमिक मेमोरी एलोकेशन # मैनुअल मेमोरी प्रबंध युक्त आठ ऑब्जेक्ट (कंप्यूटर साइंस) पर कार्रवाई में नैव मार्क-एंड-स्वीप। तीर ऑब्जेक्ट उन्मुख भाषाओं में संदर्भ (कंप्यूटर विज्ञान)#संदर्भ का प्रतिनिधित्व करते हैं। वृत्त स्वयं ऑब्जेक्ट का प्रतिनिधित्व करते हैं। ऑब्जेक्ट #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.