2010-12-03 13 views
5

मेरे पास एक लंबवत रैखिक Layout में दृश्यों की एक श्रृंखला है। प्रत्येक दृश्य को स्क्रॉल करते समय बिटमैप उत्पन्न करता है और खींचता है। प्रदर्शन कारणों से, मैं प्रत्येक बार ड्रॉ() को बिटमैप उत्पन्न नहीं करता हूं, लेकिन स्मृति कारणों से मैं बिटमैप्स के लिए कठिन संदर्भ नहीं रख सकता। मैं उस रणनीति पर सलाह का उपयोग कर सकता हूं जिसे मुझे लेना चाहिए।एंड्रॉइड: बिटमैप्स, सॉफ्ट रेफरेंस, और ओओएम?

मैंने पहले से ही स्पष्ट मार्ग की कोशिश की है: बिटमैप उत्पन्न करना, और उसके बाद इसे सॉफ्ट रेफरेंस के साथ लपेटना। यह दो कारणों से विफल रहा। 1. संदर्भ अपेक्षा से अधिक उत्सुकता से इकट्ठा हो जाते हैं। 2. मुझे अभी भी ओओएम मिल गया है! जो चौंकाने वाला है, क्योंकि कोई बिटमैप विशेष रूप से बड़ा नहीं है, इसलिए एक दृश्य को ओओएम का कारण नहीं बनना चाहिए, जिससे मुझे लगता है कि ओओएम होता है क्योंकि अपमानजनक सॉफ्ट रेफरेंस को मुक्त होने का मौका नहीं दिया गया था। इसके अलावा, ओओएम तब होता है जब मेरे आवेदन में 6 एमबी (डीडीएमएस व्यू के अनुसार) आवंटित ढेर आकार होता है, मैं उम्मीद करता हूं कि यह ओओएम फेंकने से पहले 16 एमबी तक बढ़ेगा।

कोई सलाह?

+0

reg। "6 एमबी का आवंटित ढेर आकार है (डीडीएमएस दृश्य के अनुसार)": मेरा जवाब पढ़ें: http://stackoverflow.com/questions/3238388/android-out-of-memory-exception-in-gallery ... 6 एमबी बिटमैप्स द्वारा आवंटित आवंटित आकार नहीं है। बिटमैप्स देशी ढेर लेते हैं। –

+0

धन्यवाद, मैंने आपकी पोस्ट में अनुशंसित लॉगिंग रणनीति की कोशिश की। यह बताता है कि यह "6 एमबी" पर ओओएम क्यों है। आपके लॉगिंग कोड के मुताबिक, ओओएम जब मेरा मूल उपयोग 12 एमबी तक पहुंच जाता है (और मेरा आवेदन उपयोग करीब 4 एमबी है)। जो समझ में आता है, क्योंकि यह 16 एमबी उपयोग है। हालांकि, अगर मेरे बिटमैप्स सॉफ़्ट रेफरेंस में हैं, तो 12 एमबी तक पहुंचने पर उन्हें एकत्र नहीं किया जाना चाहिए ??? – ab11

+0

सॉफ्ट रेफरेंस के पास स्मृति उपयोग के साथ कुछ लेना देना नहीं है। – Falmarri

उत्तर

11

समस्या यह है कि बिटमैप्स फ़ाइनलाइज़र का उपयोग करते हैं, इसलिए मूल स्मृति को वास्तव में रिलीज़ होने से पहले इसमें कुछ जीसी पास लग सकते हैं। यह कुछ है जो हम बेहतर बनाने पर काम कर रहे हैं।

+0

क्या आपके पास इस दौरान कोई सिफारिशें हैं? मुझे लगता है कि मुझे ऐसा कुछ करना चाहिए: बिटमैप्स के किसी प्रकार का वैश्विक ट्रैक रखें, और बिटमैप्स का कुल आकार खतरनाक होने पर मैन्युअल रूप से उन्हें मुक्त करना शुरू करें? कोई सलाह कैसे कम समाधान मनमाने ढंग से बनाने के लिए? – ab11

+0

आपको कम से कम हाल ही में उपयोग किए गए बिटमैप्स पर मैन्युअल रूप से रीसायकल() को कॉल करना चाहिए। –

+0

मुझे लगता है कि रीसायकल() इसे अप्रयुक्त के रूप में चिह्नित करेगा, और फिर अगली बार कचरा कलेक्टर चलाने के बाद इसे साफ़ कर दिया जाएगा? यदि हां, तो सॉफ़्ट रेफरेंस का उपयोग करने से यह अलग कैसे है? – ab11

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