जब करता WeakReference # get () अशक्त लौटने शुरू?

वोट
8

मैं का उपयोग करना चाहते WeakReferenceएक (Android) बिटमैप-कैश के हिस्से के रूप रों जब एक बिटमैप अब और नहीं किया जाता है की जाँच करने में सक्षम हो।

मेरे कैश अधिकतम आकार है कि जावा ढेर अंतरिक्ष से छोटा होता है है। एक नया बिटमैप कैश अतिप्रवाह होता है, यह बिटमैप्स कि अब कोई आवश्यकता नहीं कर रहे हैं की जाने दिया जाना चाहिए।

मेरा प्रश्न: जब get () करता है - एक की विधि WeakReferenceवापसी अशक्त?

  1. जैसे ही वहाँ वस्तु के लिए कोई और अधिक मजबूत संदर्भ हैं? (और जीसी अभी तक नहीं हुआ)
  2. या जब जीसी चलाने के लिए और निर्धारित उनकी कोई और अधिक मजबूत संदर्भ हैं वस्तु है कि गया है?

यदि 2. सच की तुलना में मैं स्थिति है कि अपने कैश को भरने सकता है और जीसी हाल ही में किसी कारण से नहीं चला है करना पड़ सकता है है।

फिर भी मैं पहले से ही है, पिछले जीसी चलाने के बाद संदर्भों के चलते WeakReference#get()अभी भी वस्तु वापसी होगी और अपने कैश यह साफ नहीं होता।

23/05/2013 को 17:40
उपयोगकर्ता
अन्य भाषाओं में...                            


4 जवाब

वोट
5

WeakReference जैसे ही जीसी निर्धारित किया है कि वस्तु दुर्बलता से पहुंचा जा सकता है को मंजूरी दे दी है।

यह आपके दूसरे मामले के करीब है। हालांकि, कमजोर गम्यता न सिर्फ मजबूत संदर्भ के अभाव, लेकिन यह भी नरम संदर्भ के अभाव की आवश्यकता है।

के लिए जावा पैकेज प्रलेखन से java.lang.ref :

शीतल और कमजोर संदर्भ स्वचालित रूप से यदि कोई हो, कतारों जिसके साथ वे पंजीकृत हैं में जोड़ा जा रहा से पहले कलेक्टर द्वारा मंजूरी दी जाती है।

...

एक वस्तु है, तो यह न तो जोरदार है और न ही धीरे से पहुंचा जा सकता है, लेकिन एक कमजोर संदर्भ traversing द्वारा पहुंचा जा सकता दुर्बलता से पहुंचा जा सकता है। जब एक कमजोर-पहुंच योग्य वस्तु को कमजोर संदर्भ मंजूरी दी जाती है, वस्तु को अंतिम रूप देने के लिए योग्य हो जाता है।

23/05/2013 को 17:43
का स्रोत उपयोगकर्ता

वोट
10

इस सवाल का जवाब यह Android का कौन सा संस्करण उपयोग कर रहे पर निर्भर करता है। 2.3 समय सीमा में कहीं न कहीं, एंड्रॉयड इसकी हैंडलिंग या कमजोर संदर्भ बदल दिया है। इससे पहले, यह उन्हें नष्ट कर दिया जब जीसी भाग गया। 2.3 (2.3.3?) के कुछ संस्करण के रूप में यह उनके पिछले मजबूत संदर्भ दूर जा के तुरंत बाद ही हटाया जा रहा शुरू कर दिया। इसलिए Android के आधुनिक संस्करणों में, कमजोर संदर्भ बेकार हैं।

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

कुछ खोज के बाद, मुझे लगता है कि परिवर्तन 3.0, नहीं 2.3 में बनाया गया था। फिर भी, समाधान एक ही है।

23/05/2013 को 18:08
का स्रोत उपयोगकर्ता

वोट
4

कैश करने के लिए बिटमैप SoftReference का उपयोग नहीं बल्कि कमजोर है। जी सी के रूप में जल्द WeakReference स्पष्ट रूप में यह अपने सभी मजबूत और शीतल संदर्भ जो कैशिंग करने के उद्देश्य को नष्ट कर दे खो देता होगा। SoftReference साफ़ हो जाते हैं तभी कम memory.And यह गारंटी है कि जी सी एक OOME फेंकने से पहले चलाया जाएगा है।

23/05/2013 को 18:09
का स्रोत उपयोगकर्ता

वोट
-3

के रूप में अन्य उत्तर में कहा गया है, एक WeakReference अशक्त एक बार उठाई वस्तु कोई और अधिक मजबूत / नरम संदर्भ होते हैं वापस आ जाएगी और जीसी स्मृति पुन: दावा किया है।

एक अधिक सामान्य नियम पर, मुझे नहीं लगता कि कमजोर / SoftReferences एक आवेदन में एक अच्छी बात कर रहे हैं है। यह अपने मिश्रण चिंताओं बनाता है:

  • आपका आवेदन व्यापार तर्क के बारे में है
  • JVM और Dalvik स्मृति प्रबंधन और कोड अनुकूलन के बारे में कर रहे हैं।

जब आप कमजोर / शीतल संदर्भ का उपयोग करने के लिए शुरू करते हैं, आप अपने आवेदन है, जो यह मुश्किल विकसित करने के लिए / डिबग / समझने के लिए बनाता है के भीतर स्मृति से प्रबंधित चिंताओं का परिचय।

आप के बजाय एक निश्चित-आकार (तत्वों या बिटमैप आकार की संख्या) LRU कैश करने के लिए चाहते हो सकता है।

उम्मीद है की वो मदद करदे !

26/05/2013 को 08:04
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more