2009-11-30 12 views
6

क्या ऑब्जेक्ट को शून्य पर सेट करना इसे जीसी के लिए चिह्नित करता है?सी #/वीबी.नेट में स्थिर तरीकों वाले वर्गों के लिए कचरा संग्रहण कैसे होता है?

संपादित करें: एक वर्ग में कई स्थैतिक विधियां हैं। अपने कार्यक्रम में इन तरीकों का उपयोग करते समय, यह सुनिश्चित करने का सबसे अच्छा तरीका क्या है कि वस्तुओं को निश्चित बिंदु के बाद जीसी के लिए चिह्नित किया गया हो?

उत्तर

11

तरीके बिल्कुल कचरा नहीं है - इसलिए यह वास्तव में स्पष्ट नहीं है कि आपका प्रश्न क्या है।

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

मेरा सुझाव है कि आप थोड़ी अधिक पृष्ठभूमि के लिए Jeffrey Richter's article on garbage collection पढ़ लें, फिर मूल बातें के साथ पकड़ने के लिए कोई और विशिष्ट प्रश्न पूछें।

3

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

4

यदि आप स्थिर तरीकों में चर द्वारा संदर्भित वस्तुओं के साथ क्या होता है, तो उन वस्तुओं को कचरे के संग्रह के लिए समझदार हो जाता है जब वे अब दायरे में नहीं होते हैं।

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

निम्न उदाहरण इस बेहतर उदाहरण देकर स्पष्ट करना हो सकता है: जब वर्ग भरी हुई है और के रूप में वर्ग उदाहरण की वस्तुओं बनाया है और नष्ट कर रहे हैं यहां तक ​​कि निहित रहेगा

class Example 
{ 
    private static object field1 = new object(); 

    public static void SomeMethod() 
    { 
     object variable1 = new object(); 

     // ... 
    } 

    public static void Deref() 
    { 
     field1 = null; 
    } 
} 

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

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

0

वर्ग विधियों के रूप में स्थिर विधियों के बारे में सोचें। वे उपलब्ध हैं कि कोई वस्तु मौजूद है या नहीं। उन्हें कचरा संग्रह पर कोई प्रभाव नहीं पड़ता है।

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