11

भी देखें इन संबंधित संसाधन:क्या एक अनुरूप सी # कंपाइलर एक स्थानीय (लेकिन अप्रयुक्त) चर को ऑप्टिमाइज़ कर सकता है यदि यह किसी ऑब्जेक्ट का एकमात्र मजबूत संदर्भ है?


दूसरे शब्दों में:

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

मुझे स्पष्ट करने दें:


void Case_1() 
{ 
    var weakRef = new WeakReference(new object()); 

    GC.Collect(); // <-- doesn't have to be an explicit call; just assume that 
        //  garbage collection would occur at this point. 

    if (weakRef.IsAlive) ... 
} 

इस कोड उदाहरण में, मैं स्पष्ट रूप से संभावना है कि new'ed object कचरा कलेक्टर द्वारा पुन: दावा है के लिए योजना बनाने के लिए है, इसलिए if कथन।

(ध्यान दें कि मैं पता चल सके कि new'ed object अभी भी चारों ओर है के एकमात्र उद्देश्य के weakRef उपयोग कर रहा हूँ।)


void Case_2() 
{ 
    var unusedLocalVar = new object(); 
    var weakRef = new WeakReference(unusedLocalVar); 

    GC.Collect(); // <-- doesn't have to be an explicit call; just assume that 
        //  garbage collection would occur at this point. 

    Debug.Assert(weakRef.IsAlive); 
} 

पिछले एक से इस कोड उदाहरण में मुख्य परिवर्तन यह है कि नए object को स्थानीय चर (unusedLocalVar) द्वारा दृढ़ता से संदर्भित किया गया है। हालांकि, कमजोर संदर्भ (weakRef) के बाद इस चर का उपयोग कभी भी नहीं किया जाता है।


प्रश्न: एक अनुरूप सी # संकलक Case_1 के उन लोगों में Case_2 के पहले दो लाइनों का अनुकूलन करने की अनुमति दी देखता है कि अगर unusedLocalVar केवल अर्थात् WeakReference निर्माता के लिए एक तर्क के रूप, एक ही स्थान पर प्रयोग किया जाता है? यानी क्या कोई संभावना है कि Case_2 में दावा कभी विफल हो सकता है?

उत्तर

11

इससे कोई फर्क नहीं पड़ता कि सी # कंपाइलर क्या करता है - जेआईटीटर/जीसी को स्थानीय संदर्भों को साफ करने की अनुमति है जब वे एक विधि शरीर में ज़िंदा नहीं रह जाते हैं। GC.KeepAlive

के लिए दस्तावेज़ों को देखें, इसके अलावा, यह powerpoint presentation, विशेष रूप से स्लाइड 30 से आगे, यह समझाने में सहायता करता है कि जेआईटी/जीसी क्या हो सकता है।

+4

यह भी ध्यान दें कि, डिबग बिल्ड में, चर को स्पष्ट रूप से डीबगर के लिए दायरे के अंत तक जीवित रखा जाता है - यह केवल रिलीज में ही बनाता है, आपको यह व्यवहार दिखाई देगा। –

+0

@ एंडी - दिलचस्प बिंदु। यह महत्वपूर्ण नहीं है, लेकिन मुझे लगता है कि यह व्यवहार JITTER द्वारा शासित है? –

+4

और पूर्णता के लिए, यही कारण है कि विधि के _end_ पर 'unusedLocalVar = null' सेटिंग आमतौर पर एक डी-ऑप्टिमाइज़ेशन होती है। –

3

मेरे प्रश्न का उत्तर दिया गया है, मैंने सोचा कि मैं abhinaba द्वारा जानकारी मैं सिर्फ MSDN ब्लॉग लेख "WP7: When does GC Consider a Local Variable as Garbage" पर पाए जाने वाले इस प्रासंगिक टुकड़ा पोस्ट चाहते हैं:

[टी] वह ECMA विनिर्देश (ECMA 334 धारा 10.9) [है & hellip;] राज्यों

"उदाहरण के लिए, यदि एक स्थानीय चर दायरे में है कि एक वस्तु को केवल मौजूदा संदर्भ है, लेकिन है कि स्थानीय चर से निष्पादन के किसी भी संभावित निरंतरता में करने के लिए भेजा कभी नहीं किया गया है प्रक्रिया में वर्तमान निष्पादन बिंदु, ए कार्यान्वयन हो सकता है (लेकिन आवश्यक नहीं है) का उपयोग अब नहीं के रूप में वस्तु का इलाज। "

यह यह सब कहते हैं। उल्लिखित आलेख में यह भी कहा गया है कि .NET ढांचा (कम से कम रिलीज मोड में) पूर्वानुमानित विश्लेषण और ऐसी वस्तुओं को मुक्त करेगा, जबकि .NET कॉम्पैक्ट फ्रेमवर्क (प्रदर्शन कारणों से) नहीं होगा।

0

एक अनुरूप सी # संकलक Case_1 के उन लोगों में Case_2 के पहले दो लाइनों का अनुकूलन करने की अनुमति दी है, तो यह देखता है कि unusedLocalVar केवल अर्थात् WeakReference निर्माता के लिए एक तर्क के रूप, एक ही स्थान पर प्रयोग किया जाता है है?

दो परिभाषाएं समान हैं, इसलिए एक से दूसरे में बदलना एक "अनुकूलन" नहीं है क्योंकि न तो अधिक कुशल है।

यानी क्या कोई संभावना है कि केस_2 में दावा कभी विफल हो सकता है?

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

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