2011-12-01 18 views
7

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

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

मैं सोच रहा था अगर किसी को कोड में इन जड़ों के उदाहरण दे सकता है?

धन्यवाद

उत्तर

7

मान लें आप निम्नलिखित कार्यक्रम चलाने:

class Program 
{ 
    static Class1 foo = new Class1(); 

    static void Main(string[] args) 
    { 
     Class2 bar = new Class2(); 

     Class3 baz = new Class3(); 
     baz = null; 

     Debugger.Break(); 

     bar.Run(); 
    } 
} 

कार्यक्रम डीबगर में टूट जाता है, वहाँ 3 + ऑब्जेक्ट क्योंकि निम्न संदर्भ का कचरा संग्रहण के लिए पात्र नहीं हैं कर रहे हैं:

  • एक Class1 वस्तु स्थिर क्षेत्र द्वारा संदर्भित foo
  • एक string[] वस्तु पैरामीटर द्वारा संदर्भित args
  • शून्य या अधिक string वस्तुओं string[] वस्तु द्वारा args
  • एक Class2 वस्तु स्थानीय चर द्वारा संदर्भित संदर्भित द्वारा संदर्भित bar

Class3 वस्तु कचरा के लिए पात्र है संग्रह और पहले से ही एकत्रित किया जा सकता है या अंतिम रूप देने का इंतजार कर रहा है।

सी # में वैश्विक वस्तुओं के संदर्भों की अनुमति नहीं है। सीपीयू रजिस्टरों में संदर्भ वीएम का कार्यान्वयन विवरण हैं।

+3

इस बिंदु पर 'बार' वास्तव में रिलीज मोड में संग्रह के लिए योग्य हो सकता है क्योंकि इसे ब्रेक के बाद संदर्भित नहीं किया जाता है। –

+0

ब्रायन सही है, 'बार' केवल * डीबग मोड * में जीवित रखा जाएगा, मुख्य विधि के अंत तक, जो केवल डिबगिंग सुविधा के लिए है - रिलीज मोड 'बार' में एकत्र किया जा सकता है। – BrokenGlass

+0

मेरा मानना ​​है कि यदि आप DEBUG में चल रहे हैं, तब तक ऑब्जेक्ट हमेशा सुरक्षित होते हैं जब तक फ़ंक्शन समाप्त नहीं होता है। मेरा मानना ​​है कि आप अनुकूलित कोड के लिए सही हैं हालांकि। –

1
class Test 
    { 
     static object ImARoot = new object(); //static objects/static fields 

     void foo(object paramRoot) // parameters I'm a root to but only when in foo 
     { 
      object ImARoot2 = new object(); //local objects but only when I'm in foo. 

      //I'm a root after foo ends but only because GC.SuppressFinalize is not called called (typically in Dispose) 
      SomethingWithAFinalizer finalizedRoot = new SomethingWithAFinalizer(); 


     } 
    } 

क्या तुमने कभी पता लगाने के लिए आप SOS (विजुअल स्टूडियो 2005 में या बाद में या WinDbg में) क्या एक वस्तु एक भी बिंदु पर करने के लिए निहित है का उपयोग करें और! Gcroot आदेश का उपयोग कर सकते हैं।

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