देख सकता हूं, मेरे पास 600x800 पिक्सेल जेपीईजी से अधिक गैलरी के साथ आउटऑफमेमरी अपवाद है।एंड्रॉइड: आउटफमेमरी एरर: बिटमैप आकार वीएम बजट से अधिक नहीं है, मुझे कोई कारण नहीं है कि मैं
पर्यावरण
मैं गया है 600x800 पिक्सल के आसपास जेपीजी छवियों के साथ गैलरी का उपयोग किया गया।
चूंकि मेरी सामग्री सिर्फ छवियों की तुलना में थोड़ा अधिक जटिल हो सकती है, इसलिए मैंने प्रत्येक दृश्य को रिलेटिवलायआउट के रूप में सेट किया है जो जेपीजी के साथ छवि दृश्य को लपेटता है।
उपयोगकर्ता अनुभव को "तेज़" करने के लिए मेरे पास 4 स्लॉट का एक सरल कैश है जो प्रीफ़ेच (लूपर में) लगभग 1 छवि बाईं ओर और 1 छवि प्रदर्शित छवि पर सही है और उन्हें 4 स्लॉट हैश मैप में रखता है।
मंच
मैं 256 रैम और 128 ढेर आकार की AVD उपयोग कर रहा हूँ, एक 600x800 स्क्रीन के साथ। यह एंटोरेज एज लक्ष्य पर भी होता है, सिवाय इसके कि डिवाइस के साथ डीबग करना कठिन होता है।
समस्या
मैं एक अपवाद हो रही किया गया है:
OutofMemoryError: bitmap size exceeds VM budget
और यह तब होता है जब पांचवें छवि प्राप्त करते समय। मैंने अपने छवि कैश के आकार को बदलने की कोशिश की है, और यह अभी भी वही है।
अजीब बात:
आदेश यकीन है कि ढेर सीमा बहुत दूर मैं क्या जरूरत से दूर है बनाने के लिए, मैं में एक डमी 8MB सरणी को परिभाषित किया है वहाँ एक स्मृति समस्या नहीं किया जाना चाहिए शुरुआत, और इसे बिना संदर्भित छोड़ दिया ताकि इसे तुरंत प्रेषित किया जा सके। यह गतिविधि धागा के एक सदस्य है और
static { @SuppressWarnings("unused")
byte dummy[] = new byte[ 8*1024*1024 ]; }
नतीजा यह है कि ढेर आकार लगभग 11MB है और यह सब मुफ़्त है है निम्नलिखित के रूप में परिभाषित किया गया है। नोट मैंने क्रैश होने के बाद उस चाल को जोड़ा है। यह आउटऑफमेमरी कम बार-बार बनाता है।
अब, मैं डीडीएमएस का उपयोग कर रहा हूं। बस से पहले दुर्घटना (दुर्घटना के बाद ज्यादा परिवर्तन नहीं करता है), डी डी एम एस पता चलता है:
ID Heap Size Allocated Free %Used #Objects
1 11.195 MB 2.428 MB 8.767 MB 21.69% 47,156
और विस्तार तालिका में दिखाई देता है:
Type Count Total Size Smallest Largest Median Average
free 1,536 8.739MB 16B 7.750MB 24B 5.825KB
सबसे बड़ा ब्लॉक 7.7MB है। और फिर भी LogCat का कहना है:
ERROR/dalvikvm-heap(1923): 925200-byte external allocation too large for this process.
आप मंझला और औसत के संबंध मन है, तो यह मान लेना कि उपलब्ध ब्लॉक के सबसे बहुत छोटे होते हैं प्रशंसनीय है। हालांकि, बिटमैप के लिए काफी बड़ा ब्लॉक है, यह 7.7 एम है। यह अभी भी पर्याप्त नहीं है?
नोट: मैंने एक ढेर का निशान दर्ज किया। आवंटित डेटा की मात्रा को देखते समय, ऐसा लगता है कि 2 एम से अधिक आवंटित नहीं किया गया है। यह डीडीएमएस द्वारा मुफ्त मेमोरी रिपोर्ट से मेल खाता है।
- यह हो सकता है कि मैं ढेर-विखंडन जैसे कुछ समस्या का अनुभव?
- मैं समस्या को हल/हल कैसे करूं?
- क्या ढेर सभी धागे से साझा किया जाता है?
- क्या यह हो सकता है कि मैं गलत तरीके से डीडीएमएस रीडआउट की व्याख्या करता हूं, और आवंटित करने के लिए वास्तव में कोई 900 के ब्लॉक नहीं है? यदि हां, तो क्या कोई मुझे बता सकता है कि मैं उसे कहां देख सकता हूं?
धन्यवाद एक बहुत
Meymann
यदि आप वास्तव में लाने/डिकोडिंग/कैशिंग/बिटमैप्स की समाप्ति कर रहे कोड को पोस्ट करते हैं तो आपको यहां कुछ काटने मिल सकते हैं। समस्या लगभग निश्चित रूप से आप वहां क्या कर रहे हैं, ऐसा कुछ नहीं है जिसके लिए ढेर आवंटन के आंतरिक भाग में खुदाई की आवश्यकता हो। –
कोड डीबग करते समय, मेरा मुख्य संदिग्ध हमेशा मेरा कोड होता है। इसे डीबग करने के लिए, मुझे पर्यावरण से संकेत प्राप्त होते हैं। दुर्भाग्यवश, इस मामले में: ए एक साधारण कोड बना रहा है जो कैश में एक समय में 600x800 की 3 छवियों को पढ़ता है, इसी तरह के परिणाम स्पोरैडिक रूप से उत्पन्न करेगा (चेक किया गया है ताकि इसे तेज़ी से तेज किया जा सके, कोई डमी असुरक्षित सरणी जोड़ सकता है) बी। मैं समस्या की जांच करने के लिए उपकरण का उपयोग करता हूं, लेकिन उपकरण से मिलने वाले संकेत मेल नहीं खाते हैं। सी। इस प्रश्न का बिंदु क्या अच्छा अभ्यास है, डीडीएमएस रीडआउट के बारे में मेरे निष्कर्षों में क्या गलत है, और यदि कोई कामकाज है तो संकेत मिल रहा है। – Meymann
** किसी अन्य रूप में समस्या को पुन: उत्पन्न करने का एक बहुत ही आसान तरीका ** 1. अपनी गतिविधि कक्षा में, स्थिर {बाइट डमी [] = नया बाइट [4096] जोड़ें; } विस्तार करने के लिए ढेर को मजबूर करने के लिए (और संदेह को हटा दें)। 2. एक व्यूफ्लिपर बनाएं। 3. लगभग 10 छवि दृश्य जोड़ें जहां प्रत्येक 600x800 बिटमैप को संदर्भित करता है। 4. जब यह दुर्घटनाग्रस्त हो जाता है, तो डीडीएमएस देखें। – Meymann