2009-11-28 9 views
8

वीक रेफरेंस के संदर्भ में वीक रेफरेंस का क्या होता है जब लक्ष्य कमांड द्वारा संदर्भित लक्ष्य वस्तु। लक्ष्य कचरा इकट्ठा किया गया है? क्या कमजोर रहता है और मौजूदा रहता है? कारण मैं पूछ रहा हूं कि मेरी सूची में संग्रहित वीक संदर्भों की एक सूची है। रनटाइम के दौरान नई सूची में लगातार वीक रेफरेंस जोड़े जा रहे हैं। अब जब लक्ष्य वस्तु मर जाती है, तो क्या मुझे अपने द्वारा छोड़े गए वीक रेफरेंस को साफ करना होगा? यदि हां, तो क्या कोई चालाक चाल है कि मैं यह कैसे कर सकता हूं? जब वीक रेफरेंस छोड़ दिया जाता है तो क्या मुझे अधिसूचित किया जा सकता है? या मुझे एक टाइमर पेश करना है जो अक्सर उस सूची के माध्यम से लूप करता है, यह देखने के लिए कि उस सूची से कोई भी वीक रेफरेंस इंस्टेंस हटाया जा सकता है या नहीं।वीक रेफरेंस के जीसी के बाद वीक रेफरेंस का क्या होता है। लक्ष्य

+0

वैसे, प्रश्न के शब्दों पर अच्छी नौकरी, मुझे लगा कि समस्या यह थी कि समस्या क्या थी हालांकि मुझे .NET के साथ लगभग कोई अनुभव नहीं है। –

उत्तर

12

यह कमजोर संदर्भों के साथ एक आम समस्या है। संदर्भ स्वयं जीवित रहता है क्योंकि इसमें सामान्य पॉइंटर्स हैं। जैसा कि आप सुझाव देते हैं, आपको समय-समय पर कुछ "मैनुअल कचरा संग्रह" करने की आवश्यकता है। ध्यान दें कि जब आप किसी अन्य कारण से सूची में जाते हैं तो आप शायद अपने रास्ते पर स्टब्स साफ़ कर सकते हैं। सूची के लिए उपयोग पैटर्न के आधार पर, यह "पक्ष में" कचरा संग्रह भी पर्याप्त हो सकता है।

इसे साफ करने के एकमात्र उद्देश्य के लिए सूची के माध्यम से "अक्सर" लूप न करें! प्रत्येक मृत स्टब केवल स्मृति के कुछ शब्दों को बर्बाद कर देता है। यदि सूची का उपयोग नहीं किया जाता है तो अक्सर इसे साफ करने की कम्प्यूटेशनल लागत उचित नहीं होती है, और यदि इसका उपयोग अक्सर किया जाता है तो यह ऊपर बताए अनुसार स्वयं को साफ कर देगा।

यह एक और कचरा-एकत्रित प्रणाली में पूरी तरह से है, लेकिन समस्याएं इतनी समान हैं कि यदि आप इसे प्राप्त कर सकते हैं तो this article में रुचि हो सकती है।

+0

यदि सूची इंडेक्स द्वारा एक्सेस नहीं की जाएगी, तो आइटम को जोड़े जाने पर सबसे अच्छी नीति संभवत: इसे शुद्ध करने के लिए संभव है, यदि अंतिम शुद्ध और अंतिम संग्रह (जीसी काउंटर का उपयोग करें) के बीच जोड़े गए आइटमों की संख्या निश्चित है सूची आकार का अंश। आम तौर पर क्या मायने रखता है यह नहीं है कि सभी जंक साफ हो जाते हैं, बल्कि यह कि जंक की मात्रा जो तत्काल संग्रह के लिए योग्य नहीं है, बनी हुई है। बीटीडब्ल्यू, वीक संदर्भों में "कुछ शब्द" से अधिक लागत है। वे बहुत महंगा नहीं हैं, लेकिन यहां तक ​​कि एक मिलियन अप्रयुक्त कमजोर रेफरी भी एक कार्यक्रम को चकित कर सकते हैं। – supercat

6

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

तो हाँ, आपको टाइमर रास्ता जाना होगा।

जोड़ा गया: आप Garbage Collection Notifications पर भी एक नज़र डाल सकते हैं।

+1

+1, लेकिन मैं जीसी अधिसूचनाओं के खिलाफ सावधानी बरतता हूं, क्योंकि वे जीसी की कुछ नई (अच्छी) विशेषताएं अक्षम करते हैं। – user7116

1

इच्छित उपयोग यह है कि आप WeakReferences के साथ एक संदर्भ Queue पंजीकृत करते हैं। जब लक्ष्य एकत्र किया जाता है, तो संदर्भ कतार में जोड़ा जाता है। आप कतार पर मतदान या प्रतीक्षा कर सकते हैं और अपनी सूची से WeakReference ऑब्जेक्ट को हटा सकते हैं।

+2

क्या आप वाकई यह तंत्र .NET है? मुझे लगता है कि आप जावा का जिक्र कर रहे हैं ... – bitbonk

+0

ओह क्षमा करें, मेरे पास थोड़ा सा अंधापन था। मैं किसी भी .NET का उपयोग नहीं करता हूं इसलिए कक्षाओं के समान नाम होने पर भ्रमित हो जाते हैं। – OrangeDog