2012-06-14 10 views
5
MyObject obj = new MyObject(); 

मुझे पता है कि 'नया' कीवर्ड कन्स्ट्रक्टर को कॉल करेगा और ऑब्जेक्ट को प्रबंधित ढेर में प्रारंभ करेगा।जब मैं MyObject obj = new MyObject()

मेरा सवाल यह है कि सीएलआर नीचे क्या कर रहा है।

  1. सीएलआर द्वारा उपरोक्त पंक्ति को कैसे निष्पादित किया जाता है?
  2. सीएलआर द्वारा ऑब्जेक्ट के लिए मेमरी आवंटित कैसे किया जाता है?
  3. सीएलआर ऑब्जेक्ट का आकार कैसे निर्धारित करता है?
  4. सीएलआर कैसे पता चलेगा, अगर वस्तु के ढेर से ऑब्जेक्ट आवंटित करने के लिए कोई जगह नहीं है?
+5

मैं आपको सी # सी के माध्यम से सीएलआर पढ़ने के लिए सिफारिश करूंगा - जेफरी रिचटर बेहतर अंतर्दृष्टि प्राप्त करने के लिए – V4Vendetta

उत्तर

2

जब कोई संदर्भ प्रकार बनाया जाता है (वर्ग, प्रतिनिधि, इंटरफेस, स्ट्रिंग, या ऑब्जेक्ट), इसे ढेर पर आवंटित किया जाता है .. नेट में चार अलग-अलग ढेर होते हैं: (gen0, gen1, gen2) (लघु वस्तु ढेर) , और LOH (बड़े वस्तु ढेर)। सृजन के समय (जीन 0 से जीन 1 से जीन 2 तक इत्यादि) के आधार पर, जो कुछ भी 85k या छोटा होता है, वह पहले तीन ढेर में से एक पर जाता है। 85k से बड़े ऑब्जेक्ट्स LOH पर रखे जाते हैं। LOH कभी संकलित नहीं होता है, इसलिए आखिरकार, मेरे द्वारा किए जा रहे प्रकार के आवंटन अंततः ओओएम त्रुटि का कारण बनेंगे क्योंकि ऑब्जेक्ट्स उस मेमोरी स्पेस के बारे में बिखरे हुए हैं। इन्हें प्रबंधित ढेर के रूप में जाना जाता है।

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

जब आप नए कीवर्ड का उपयोग करके संदर्भ प्रकार ऑब्जेक्ट बनाते हैं तो इसे ढेर पर रखा जाता है और इसका संदर्भ ज्यादातर मौजूदा चलने वाले स्टैक में उपयोग किया जाता है। वहाँ अन्य संभावित स्रोत है जहाँ आपके वस्तु refrence रूप में इस्तेमाल किया जा सकता है:

  1. वैश्विक/स्थिर वस्तु संदर्भ
  2. सीपीयू
  3. वस्तु को अंतिम रूप देने संदर्भ (अधिक बाद में)
  4. इंटरॉप संदर्भ (.NET वस्तुओं पारित कर दिया पंजीकृत करता है कॉम/API कॉल करने के लिए)
  5. ढेर संदर्भ (ज्यादातर यहां इस्तेमाल किया)

ये 5 whe से वास्तव में जी सी जड़ नोड्स हैं ऑब्जेक्ट रेफरेंस पदानुक्रम का गठन किया गया है। क्लासिक ग्राहक वर्ग की कल्पना करें, जिसमें आमतौर पर ऑर्डर क्लासेस संग्रहित संग्रह होता है। जब ऑर्डर संग्रह में ऑर्डर जोड़ा जाता है, तो संग्रह स्वयं ही जोड़े गए क्रम का संदर्भ रखता है। यदि ग्राहक वर्ग के उदाहरण के लिए भी एक स्टैक संदर्भ था।

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

ई: जी। ग्राहक ऑब्जेक्ट के लिए स्टैक-रेफरेंस -> ऑर्डर की सूची ऑब्जेक्ट का संदर्भ -> संदर्भ व्यक्तिगत ऑर्डर।

इन 5 जड़ों से संदर्भित कुछ भी जीसी के लिए प्रवण है।

कैसे स्मृति वस्तुओं के लिए आवंटित किया जाता है बिट जटिल है और यह आमतौर पर के रूप में निर्दिष्ट http://msdn.microsoft.com/en-us/magazine/cc163791.aspx

MKK के रूप में समय से बढ़ने एक सरल उदाहरण हो सकता है:

class MyClass 
{ 
    string Test="Hello world Wazzup!"; 
    byte[] data=new byte[86000]; 
} 

यह मान लेना आसान है कि MyClass का आकार जब आवंटित शामिल हैं:

• 19 वर्ण

• 86,000 बाइट्स।

वास्तव में, ऑब्जेक्ट के आकार में केवल सामान्य श्रेणी की सामग्री शामिल होगी, और ऑब्जेक्ट पॉइंटर्स को स्ट्रिंग और बाइट सरणी (कक्षा स्तर चर) में संग्रहीत करने के लिए आवश्यक स्मृति, जिसे अलग-अलग ढेर पर आवंटित किया जाता है। स्ट्रिंग को एसओएच पर आवंटित किया जाएगा, और कक्षा के उदाहरण द्वारा आयोजित ऑब्जेक्ट संदर्भ; बाइट सरणी LOH पर आवंटित की जाएगी, क्योंकि यह 85 केबी से बड़ा है।

एसओएच संकलित किया जा सकता है और इसमें कोई विखंडन नहीं होगा, जबकि LOH स्मृति में विखंडन हो सकता है।

सम्मान।

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