2011-12-13 15 views
10

यदि किसी ऑब्जेक्ट को किसी अन्य द्वारा संदर्भित नहीं किया जाता है, तो यह .NET CLR कचरा कलेक्टर द्वारा एकत्रित किया जा सकता है।कचरा संग्रह स्व-रेफरेंसियल ऑब्जेक्ट्स कैसे एकत्र करता है?

हालांकि, objA संदर्भ objB, objB संदर्भ objC, और objC वापस objA के लिए संदर्भ, कैसे कचरा कलेक्टर पता लगाने वे (एक पूरे के रूप) एकत्र करता है कि किया जा सकता है तो क्या होगा?

+2

.NET एक [चिह्न और स्वीप एल्गोरिदम (http://stackoverflow.com/questions/2344240/what-is-relation-between-gc-finalize-and-dispose) का उपयोग करता है। –

+0

ओह हाँ, जड़ों की खोज, मुझे इसके बारे में सोचना चाहिए! – athos

+0

मुझे यकीन नहीं है लेकिन मुझे लगता है कि यह किसी प्रकार की वृक्ष प्रकार की चीज़ का उपयोग करता है और जो भी मुख्य पेड़ से जुड़ा हुआ नहीं है उसे कभी भी मुख्य पेड़ से नहीं पहुंचाया जा सकता है (जिसके द्वारा मैं वर्तमान में कोड को बोल रहा हूं कहीं ढेर में)। मैं विनिर्देशों को नहीं जानता लेकिन ग्राफ सिद्धांत मुझे यकीन है कि समस्या हल हो जाएगी। :) – Chris

उत्तर

7

CLR एक तकनीक निशान और झाडू के रूप में जाना उपयोग करता है।

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

ध्यान रखें कि यह "अंकन" वैचारिक है; हकीकत में, ऑब्जेक्ट्स को संग्रह-सेट में सबसे ज्यादा जोड़ा जाता है।

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

2

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

अगर वहाँ objA, objB या ObjC हिट करने के लिए कोई रास्ता नहीं है, इन सभी वस्तुओं को एकत्र किया जाएगा

+1

नहीं, जीसी में सभी निर्मित वस्तुओं की एक सूची नहीं है ... – Guffa

+0

@ गुफा: उन वस्तुओं को कैसे ढूंढता है जिन्हें इकट्ठा करने की आवश्यकता होती है यदि उसके पास सभी संभावनाओं की सूची नहीं है? निशान और स्वीप विवरण निश्चित रूप से इंगित करते हैं कि यह ... – Chris

+0

क्रिस: जीसी वास्तव में वस्तुओं को "चिह्नित" नहीं करता है; यह एक वैचारिक निर्माण है। हकीकत में, यह ऑब्जेक्ट्स है कि जीसी ** ** पहुंच सकता है जो नकारात्मक में चिह्नित हो जाता है। दूसरे शब्दों में, एक काल्पनिक संपत्ति के बारे में सोचें जो सभी वस्तुओं पर मौजूद है, जिसे 'मार्क' कहा जाता है। 'मार्क' डिफ़ॉल्ट रूप से सत्य है, इसलिए जीसी को केवल वस्तुओं को चिह्नित करने की आवश्यकता है ** ** ** झूठी पहुंच सकते हैं। –

संबंधित मुद्दे