2008-11-22 22 views
72

क्या कोई सी # में विभिन्न प्रकार के संदर्भों के मुख्य लाभों को समझा सकता है?कमजोर संदर्भ लाभ

  • कमजोर संदर्भ
  • शीतल संदर्भ
  • प्रेत संदर्भ
  • मजबूत संदर्भ।

हमारे पास एक ऐसा एप्लिकेशन है जो बहुत मेमोरी का उपभोग कर रहा है और हम यह निर्धारित करने की कोशिश कर रहे हैं कि यह ध्यान केंद्रित करने वाला क्षेत्र है या नहीं।

+0

क्या आपका एप्लिकेशन विशेष रूप से कक्षा System.WeakReference का उपयोग करता है? – MusiGenesis

उत्तर

61

सॉफ़्ट और प्रेत संदर्भ जावा से आते हैं, मुझे विश्वास है। एक लंबा कमजोर संदर्भ (सी # के वीक रेफरेंस कन्स्ट्रक्टर को सच है) को जावा के फैंटॉम रिफरेंस के समान माना जा सकता है। यदि सी # में सॉफ़्ट रेफरेंस का एनालॉग है, तो मुझे नहीं पता कि यह क्या है।

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

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

+3

यह भी देखें: [कमजोर संदर्भ (एमएसडीएन)] (http://msdn.microsoft.com/en-us/library/ms404247.aspx) –

35

एमएसडीएन weak references का एक अच्छा स्पष्टीकरण है। कुंजी उद्धरण नीचे जहां लिखा है पर है:

बचें प्रबंधन समस्याओं याद करने के लिए स्वत: समाधान के रूप में कमजोर संदर्भों का उपयोग। इसके बजाय, के लिए एक प्रभावी कैशिंग नीति विकसित करें जो आपके एप्लिकेशन की ऑब्जेक्ट्स को संभालने में सक्षम है।

हर बार जब मैंने जंगली में वीक रेफरेंस देखा है, तो इसे स्मृति प्रबंधन समस्याओं के स्वचालित समाधान के रूप में उपयोग किया जाता है। आपके आवेदन की समस्याओं के लिए बेहतर समाधान हो सकते हैं।

+2

मुझे लगता है कि उद्धरण उलझन में है, क्योंकि ऐसा लगता है कि कमजोर संदर्भों का हर उपयोग संभवतः हो सकता है आवेदन द्वारा संभाला जा सकता है। उदाहरण में, ट्री व्यू के प्रलेखन का उपयोग करता है, एप्लिकेशन मॉनिटर कर सकता है कि उपयोगकर्ता ने समय के लिए ट्री व्यू का उपयोग किया है, और यदि नहीं, तो ट्री व्यू को शून्य पर सेट करें, कचरा कलेक्टर को उस पर रखने की अनुमति दें। वह एक ही कार्य पूरा करेगा, लेकिन आवेदन से। –

+2

@ डीजीजीन्यूइन: व्यक्तिगत रूप से, मुझे कमजोर संदर्भों के लिए बिल्कुल कोई उपयोग नहीं दिखता है। मैंने उन परियोजनाओं में उन्हें कुछ बार सामना किया है जिन्हें मैंने अन्य डेवलपर्स से विरासत में मिला है, और प्रत्येक मामले में मुझे उन्हें पूरी तरह से हटा देना था, क्योंकि मूल डेवलपर्स को यह समझ में नहीं आया कि वे क्या हैं और उनका क्या अर्थ है। – MusiGenesis

+9

@MusiGenesis: 'मुझे कमजोर संदर्भों के लिए बिल्कुल कोई उपयोग नहीं दिखता है': जब तक आपके जीसी-सक्षम रनटाइम में मेमोरी रिसाव न हो, क्योंकि कोड में कहीं भी ट्री नोड का संदर्भ होता है जो सभी पेड़ को संदर्भित करता है, और इस प्रकार , ** ** कचरा इकट्ठा करने योग्य तथ्य के बावजूद यह अब और उपयोग नहीं किया जाता है। कमजोर संदर्भ (कमजोर संदर्भ) के रूप में उपयोग किया जाता है: "* यदि वस्तु अभी भी उपयोग में है, तो मैं इसके साथ कुछ करने में सक्षम होना चाहता हूं, लेकिन यदि यह अब नहीं है, तो किसी भी तरह से मैं बनना नहीं चाहता इसे जीवित रखने के लिए। * "यह कोड स्वच्छता है, किसी ऑब्जेक्ट का स्वामित्व या गैर-स्वामित्व निर्धारित करना। – paercebal

4

वीक रेफरेंस के साथ शानदार वास्तविक उदाहरण Android development tutorial में समझाया गया है।

दृश्य (छवि दृश्य) पर एक छवि (बिटमैप) और छवि कंटेनर है। अगर छवि स्मृति से नहीं लोड की जाएगी (लेकिन डिस्क, नेट से) तो यह यूआई थ्रेड और स्क्रीन को लॉक कर सकती है। इसे रोकने के लिए एक एसिंक कार्य का उपयोग किया जा सकता है।

समस्या तब उत्पन्न होती है जब एसिंक कार्य समाप्त होता है। उस समय छवि कंटेनर उपयोगी नहीं हो सकता है (स्क्रॉल करने के बाद स्क्रीन बदल दी गई है या एंड्रॉइड अनदेखा अदृश्य दृश्य भाग)। WeakReference यहां मदद कर सकता है और ImageView कचरा एकत्रित किया जाएगा।

class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> { 
    private final WeakReference<ImageView> imageViewReference; 

    public BitmapWorkerTask(ImageView imageView) { 
     imageViewReference = new WeakReference<ImageView>(imageView); 
    } 
    // Method for getting bitmap is removed for code clearness 

    // Once complete, see if ImageView is still around and set bitmap. 
    @Override 
    protected void onPostExecute(Bitmap bitmap) { 
     if (imageViewReference != null && bitmap != null) { 
      final ImageView imageView = imageViewReference.get(); 
      if (imageView != null) { 
       imageView.setImageBitmap(bitmap); 
      } 
     } 
    } 
} 

पीएस उदाहरण जावा में है, लेकिन सी # डेवलपर्स द्वारा समझा जा सकता है।
स्रोत: http://developersdev.blogspot.ru/2014/01/weakreference-example.html

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