2012-01-12 15 views
47

इन दो वर्गों पर विचार करें?कचरा कलेक्टर और वृत्तीय संदर्भ

मान लीजिए मैं यह कर:

void f() 
{ 
    B b = new B(); 
} 

इस विधि में, मैं b बुलाया B का एक उदाहरण बना सकते हैं और विधि रिटर्न, b दायरे से बाहर चला जाता है जब, और जीसी यह इकट्ठा करने के लिए सक्षम होना चाहिए , लेकिन अगर इसे इकट्ठा करना था, तो उसे a पहले एकत्र करना होगा जो B का सदस्य है, और a एकत्र करने के लिए, इसे पहले b एकत्र करने की आवश्यकता है जो A का सदस्य है। यह परिपत्र बन जाता है। तो मेरा सवाल यह है: क्या जीसी को वस्तुओं को इकट्ठा करने से रोकने के लिए इस तरह का परिपत्र संदर्भ है?

  • यदि हां, तो हम इस समस्या से कैसे बच सकते हैं? हम कैसे सुनिश्चित कर सकते हैं कि हमारे वर्ग डिजाइन में हमारे पास परिपत्र संदर्भ नहीं है? क्या कोई उपकरण (या कंपाइलर विकल्प) है जो हमें परिपत्र संदर्भ का पता लगाने में मदद करता है?
  • यदि नहीं, तो हम कहां और क्यों WeakReference कक्षा का उपयोग करते हैं? इसका उद्देश्य क्या है?
+1

यहां एक नज़र डालें http://stackoverflow.com/questions/400706/circular-references-cause-memory-leak –

+0

कम से कम तार्किक रूप से संदर्भों में से एक हमेशा कमजोर होता जा रहा है: आपके उदाहरण में, साफ़ 'ए 'बी 'पर निर्भर नहीं हो सकता है, क्योंकि' ए 'को' बी 'के सदस्य के रूप में पहले बनाया जाना चाहिए, और इसलिए' ए 'केवल' बी 'के लिए एक कमजोर संदर्भ रख सकता है। इस प्रकार पहले 'बी' को नष्ट करना और फिर 'ए' को नष्ट करना सुरक्षित है। पुनरावर्ती तर्क, हर कंप्यूटर कार्यक्रम इस प्रकार होना चाहिए। कभी * सत्य *, पूरी तरह से सममित परिपत्र निर्भरता नहीं हो सकती है। –

+0

@ केरेकस्क: मैं उस तर्क से सहमत हूं। लेकिन यह सृजन के बिंदु से देखा जाता है। क्या जीसी इसका विश्लेषण करने जा रहा है (यानी इस तरह के वर्गों के प्रत्येक तरीके में कोड, केवल तभी यह निष्कर्ष तक पहुंच सकता है)? मेरा मतलब है, अगर आप वस्तुओं को बनाने के बाद वस्तुओं को देखते हैं, तो यह बहुत ही समस्याग्रस्त दिखता है। – Nawaz

उत्तर

74

.NET कचरा कलेक्टर पूरी तरह परिपत्र संदर्भों को संभाल सकता है। बहुत कैसे कचरा कलेक्टर से काम करता है के उच्च स्तर दृश्य

  • स्थानीय लोगों, स्टैटिक्स और जीसी पिन किए गए वस्तुओं के साथ प्रारंभ होता है ...। इनमें से कोई भी एकत्र नहीं किया जा सकता
  • इन ऑब्जेक्ट्स के बच्चों को ट्रैवर्स करके प्रत्येक ऑब्जेक्ट को चिह्नित किया जा सकता है
  • चिह्नित नहीं होने वाली प्रत्येक वस्तु को एकत्र करें।

यह परिपत्र संदर्भों को बस ठीक से एकत्र करने की अनुमति देता है। जब तक उनमें से कोई भी ऑब्जेक्ट से पहुंचने योग्य नहीं है, तो परिपत्र संदर्भ अनिवार्य रूप से अप्रासंगिक है।

नोट: मुझे लगता है मैं इस सवाल का जवाब सरल और सीधा

+0

यह कम्प्यूटेशनल रूप से महंगा नहीं होगा –

25

नहीं है, यह एक समस्या है क्योंकि जीसी परिपत्र संदर्भ

MSDN कहते हैं

तो वस्तुओं का एक समूह एक दूसरे से संदर्भ होते हैं, लेकिन इन में से कोई भी वस्तु को संभाल सकता है नहीं होगा को सीधे या अप्रत्यक्ष रूप से स्टैक या साझा चर से संदर्भित किया जाता है, फिर कचरा संग्रह स्वचालित रूप से स्मृति को पुनः प्राप्त कर देगा।

+1

और यही वह भाषा है जो महान बनाता है! – Aggressor

5

नहीं कि वृत्तीय संदर्भ कचरा कलेक्टर को प्रभावित नहीं करेगा, और यह पूरी तरह से बी

के कहने इकट्ठा करने के लिए कचरा कलेक्टर को पता है कि कोई जाने के बाद बी के कहने संदर्भित कर सकते हैं सक्षम हो जाएगा दायरे से बाहर, और इसके परिणामस्वरूप, कोई भी बी के अप्रत्यक्ष संदर्भ ए

5

कई जवाब रखने के लिए बाहर छोड़ दिया है कई मजेदार विवरण पहले से ही स्पष्ट किया कि वृत्तीय संदर्भ में कोई समस्या नहीं हैं एहसास।

कमजोर संदर्भों के रूप में - उनका उपयोग करने का कारण कैशिंग है।

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

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