मैं एंड्रॉइड 3.1, बड़े हेपसाइज विकल्प पर परीक्षण कर रहा हूं, लगभग 250 एम मेमोरी उपलब्ध है। - मैं बटन समस्या के बिना कई बार हिट कर सकते हैंएंड्रॉइड जीसी मेमोरी विखंडन विफल। वैकल्पिक हल?
float [][][]foo = new float[3][2048][2048];
Bitmap bm = Bitmap.createBitmap(2048, 2048, Bitmap.Config.ARGB_8888);
bm.recycle();
bm = null;
foo = null;
मैं इस के लिए स्मृति के बहुत सारे है:
मैं जब भी मैं मेरे ऐप की वरीयता में टेस्ट बटन हिट चलाने के लिए निम्न कोड निर्धारित किया है।
लेकिन अगर मैं बटन को मारता रहता हूं, अंततः (20 से कम हिट) यह आउटऑफमेमरी के साथ मर जाता है। [आमतौर पर android.graphics.Bitmap.nativeCreate (मूल विधि)]
कुछ भी नहीं चल रहा है - मुझे प्राथमिकताएं कभी नहीं छोड़नी पड़ेगी। एक छोटा टोस्ट है जो बटन दबाते समय भी प्रदर्शित होता है, इसलिए अन्य यूआई गतिविधि की एक छोटी राशि चल रही है।
क्या यह विखंडन के कारण है, या एंड्रॉइड बिटमैप कोड और/या जीसी में बस एक भयानक बग है? या मैं बस कुछ बेवकूफ कर रहा हूँ? (कृपया इसे कुछ बेवकूफ बनें ...)
क्या किसी के पास कोई कामकाज है? चूंकि उपर्युक्त प्रत्येक बार उपयोगकर्ता द्वारा इसे आमंत्रित करने के लिए मेरे कोड को क्या करना है, और वास्तव में चर के सावधानीपूर्वक समाशोधन के बावजूद कुछ उपयोगों के बाद मर जाता है। (और यह मुझे पागल एक लंबे समय के लिए अब ड्राइविंग कर दिया गया है!)
[अपडेट]
मैंने पुष्टि की है कि यह एक विखंडन मुद्दे या जीसी बग है, के रूप में एक ढेर डंप मैं केवल 5.6M जब उपयोग कर रहा हूँ पता चलता प्रसंस्करण के दौरान लगभग 26 मीटर पर निष्क्रिय (कोई रिसाव नहीं)। (इसके अलावा, देशी ढेर 4 एम से नीचे रहता है।) जबकि जावा ढेर इस समय मेरे परीक्षण डिवाइस पर 280 एम सीमा तक बढ़ता है, जिस बिंदु पर मैं आउटऑफमेमरी अपवाद प्राप्त करना शुरू करता हूं। तो मैं केवल अपने उपलब्ध ढेर का 10% चोटी पर उपयोग कर रहा हूं, लेकिन आउटऑफमेमरी प्राप्त कर रहा हूं।
[System.gc() को कॉल जोड़ना दुर्भाग्य से ऊपर दिए गए सरल परीक्षण मामले को ठीक करता है। मैं दुर्भाग्यपूर्ण कहता हूं क्योंकि (ए) इसे कोई फर्क नहीं पड़ता है, और (बी) क्योंकि मैं इसे पहले से ही अपने वास्तविक कोड में नियमित रूप से कॉल करता हूं, इसका मतलब है कि ऊपर मेरा सरल परीक्षण मामला बहुत आसान है।]
क्या कोई और चलाता है इस मामले में? कोई कामकाज? क्या मेरे ऐप को पुनरारंभ करने का कोई शानदार तरीका है?
[अपडेट]
निम्न संस्करण मज़बूती से 3 से 4 आमंत्रण (बटन के प्रेस) में OutOfMemory कारण बनता है:
float [][][]foo = new float[3][2048][2048];
Bitmap bm = Bitmap.createBitmap(2048, 2048, Bitmap.Config.ARGB_8888);
int []bar = new int[3*2048*2048];
bm.recycle();
bm = null;
System.gc();
foo = null;
System.gc();
bar = null;
System.gc();
मेमोरी ट्रेसिंग जब तक यह सीमा को छूता ढेर तेजी से प्रत्येक मंगलाचरण से बढ़ रहा से पता चलता और मर जाता है। यदि मैं तीन आवंटन में से किसी एक को हटा देता हूं, तो यह संतुलन तक पहुंचता है और अनिश्चित काल तक जीवित रहता है। आखिरी जीसी() के अलावा सभी को हटाने से यह थोड़ा जल्दी मर जाता है।
मैं कहूंगा कि यह एक विखंडन मुद्दा है, प्रति जीसी बग नहीं। अगर कोई जानता है कि इसे कैसे ठीक किया जाए, तो मुझे बताएं। Int [] आवंटन बिटमैप लिखने के लिए है, इसलिए मेरे पास 2 डी सरणी (एंड्रॉइड बिटमैप लाइब्रेरी की सीमा) के रूप में आवंटित करने का विकल्प नहीं है।
मुझे नहीं पता कि इससे मदद मिलेगी, लेकिन दल्विक एक [मार्क-एंड-स्वीप] का उपयोग करता है (http://www.brpreiss.com/books/opus5/html/page424.html#SECTION0014300000000000000000) जीसी टाइप करें। जहां तक सभी उपलब्ध स्मृति का उपयोग नहीं किया जाता है, तब इसे प्रतीक्षा करने का प्रयास किया जाएगा, फिर इसे एक बार में साफ़ करें (प्रदर्शन समस्याएं, क्योंकि इसे जीसी में प्रसंस्करण रोकने की आवश्यकता है)। शायद 'System.gc();' कॉल इस समस्या के साथ बिल्कुल जरूरी है, क्योंकि जीसी छोटी वस्तुओं की अपेक्षा कर रहा है। – Ancantus
@Ancantus - दुर्भाग्यवश, जैसा कि बताया गया है, मैं अपने असली कोड में प्रत्येक रीसायकल()/null के बाद System.gc() को कॉल करता हूं और अभी भी यह व्यवहार प्राप्त करता हूं। मुझे लगता है कि यह एक विखंडन समस्या है या System.gc() जैसे कुछ पृष्ठभूमि थ्रेड में अनदेखा या व्यवहार किया जा रहा है। यदि स्मृति करने के लिए एक विश्वसनीय तरीका था तो स्मृति को कॉम्पैक्ट करने के लिए मैं अपने ऐप को स्क्रैच से मारने और पुनरारंभ करने के इच्छुक हूं। मुझे यह बताने के लिए भी एक कॉल करना होगा, जीसी के बाद, जावा ढेर का कितना खाली स्थान है (जो मुझे तुरंत बताएगा और निश्चित रूप से यह एक विखंडन समस्या या अस्पष्ट रिसाव है)। क्या कोई है? – Brandyn
याहू जैसा कि आप शायद 'System.gc() को कॉल करना जानते हैं;' जीसी शुरू करने के लिए सिर्फ झंडे को झुकाता है, इसका मतलब यह नहीं है कि यह बिल्कुल चल जाएगा। असल में मैं जीसी बिटमैप से संबंधित समस्याओं के लिए एक खोज कर रहा था, [यह SO सवाल] (http://stackoverflow.com/questions/7852943/what-does-bitmaprecycle-in-android-honeycomb-actually-do) मदद कर सकता है। – Ancantus