24

एंड्रॉइड पर AFAIK, स्मृति रिसाव से बचने के लिए बिटमैप ऑब्जेक्ट्स को वीक संदर्भों के संदर्भ में अनुशंसा की जाती है। जब बिटमैप ऑब्जेक्ट का कोई और कठिन संदर्भ नहीं रखा जाता है, तो कचरा कलेक्टर स्वचालित रूप से इसे एकत्र करेगा।बिटमैप, बिटमैप.रसायकल(), वीक रेफरेंस, और कचरा संग्रह

अब, अगर मैं सही ढंग से समझता हूं, तो बिटमैप.रेसायकल() विधि को हमेशा बिटमैप मुक्त करने के लिए बुलाया जाना चाहिए। मुझे लगता है कि ऐसा इसलिए है क्योंकि बिटमैप ऑब्जेक्ट्स में विशेष मेमोरी प्रबंधन है।

क्या यह सही है?

यदि यह सच है, तो वीक रेफरेंस का उपयोग करते समय, मेमोरी लीक होनी चाहिए क्योंकि वीक रेफरेंस मुक्त होने पर बिटमैप.रेसायकल() को कभी नहीं कहा जाता है। या, किसी भी तरह, स्मृति रिसाव से बचने के लिए वीक संदर्भ पर्याप्त हैं?

धन्यवाद

उत्तर

50

Bitamp.recycle की आवश्यकता नहीं है, के नाम से जाना के रूप में कचरा कलेक्टर अंततः अपने आप ही बिटमैप्स को साफ होगा (जब तक वहाँ कोई संदर्भ हैं)। एंड्रॉइड में बिटमैप्स मूल स्मृति में बनाए जाते हैं, वीएम ढेर पर नहीं, इसलिए वीएम ढेर पर वास्तविक बिटमैप ऑब्जेक्ट बहुत छोटा होता है क्योंकि इसमें कोई वास्तविक बिटमैप डेटा नहीं होता है। (संपादित करें: अब एंड्रॉइड 3.0+ के मामले में नहीं) बिटमैप का वास्तविक आकार अभी भी जीसी के प्रयोजनों के लिए आपके ढेर उपयोग के खिलाफ गिना जाएगा और यह सुनिश्चित करना होगा कि आपका ऐप बहुत अधिक स्मृति का उपयोग न करे।

हालांकि, बिटमैप्स की बात आने पर जीसी थोड़ा मूडी लगता है। यदि आप केवल सभी कठिन संदर्भों को हटा देते हैं, तो कभी-कभी (मेरे मामले में) थोड़ी देर के लिए बिटमैप्स पर लटका होगा, शायद अजीब तरीके से बिटमैप ऑब्जेक्ट्स आवंटित/गिने जाते हैं। Bitmap.recycle जीसी को उस वस्तु को अधिक तेज़ी से इकट्ठा करने के लिए अच्छा लगता है।

किसी भी तरह से, आप स्मृति अगर आप Bitmap.recycle रूप में लंबे समय फोन नहीं है, जैसा कि आप कठिन संदर्भ गलती नहीं रखते लीक नहीं होगा। यदि आप कॉलिंग के बिना एक बार या बहुत बड़े बिटमैप पर बहुत सारे बिटमैप आवंटित करने का प्रयास करते हैं तो आप आउटऑफमेमरी एरर का सामना कर सकते हैं।

संपादित करें: यह ध्यान रखना महत्वपूर्ण है कि एंड्रॉइड 3.0 के रूप में, बिटमैप्स अब मूल स्मृति में आवंटित नहीं किए जाते हैं। किसी अन्य जावा ऑब्जेक्ट की तरह वीएम ढेर पर आवंटित किए जाते हैं। हालांकि, मैंने रीसायकल को कॉल करने की आवश्यकता नहीं होने के बारे में जो भी कहा, वह अभी भी लागू होता है।

+0

स्पष्ट स्पष्टीकरण। आपका बहुत बहुत धन्यवाद ! – Sly

+0

मैं लगभग 20 सेकंड अंतराल के साथ छवियों को लोड करता हूं। मैं रीसायकल को कॉल करता हूं() लेकिन Debug.getNativeHeapAllocatedSize() से पता चलता है कि देशी स्मृति आवंटन लगातार आउटऑफमेमरी एरर – Maxim

+0

तक बढ़ रहा है यह एक बहुत अच्छी पोस्ट है! – user123321

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