2014-10-13 8 views
6

पर विस्तार न करें एक सर्वर पर तेज़ छवि अपलोड करने के लिए बड़े बिटमैप का आकार बदलते समय मैं कभी-कभी आउटऑफमेमरी एरर में भाग गया। इसे रोकने के लिए मैं आवश्यक मात्रा में स्मृति की गणना करता हूं और यह जांचता हूं कि यह छवि को स्केल करने से पहले Runtime.getRuntime()। MaxMemory() से अधिक है या नहीं।जेनमोशन एमुलेटर

हालांकि, मैं अभी भी ओओएम त्रुटियों में भाग लेता हूं, भले ही छवि आसानी से ढेर पर फिट हो।

नकली डिवाइस (गैलेक्सी एसआईआई एपीआई 16) मुझे उपर्युक्त विधि का उपयोग करके 67108864 बाइट्स की अधिकतम मेमोरी देता है।

निम्न स्निपेट में, ढेर का आकार 43 9 75 के है और केवल < उस स्मृति का 15K उपयोग में है। मेरे ~ 31 के आवंटन के लिए ढेर स्वचालित रूप से लगभग 45K तक बढ़ना चाहिए जो अभी भी 64 एमआईबी के अधिकतम आकार के करीब नहीं है। लेकिन जैसा कि आप देख सकते हैं, ढेर का विस्तार करने के बजाय, दल्विक वीएम स्मृति से बाहर चला जाता है।

10-13 20:35:57.223: D/dalvikvm(1201): GC_FOR_ALLOC freed 505K, 67% free 14692K/43975K, paused 31ms, total 31ms 
10-13 20:35:57.223: I/dalvikvm-heap(1201): Forcing collection of SoftReferences for 31961100-byte allocation 
10-13 20:35:57.251: D/dalvikvm(1201): GC_BEFORE_OOM freed 2K, 67% free 14689K/43975K, paused 29ms, total 29ms 
10-13 20:35:57.251: E/dalvikvm-heap(1201): Out of memory on a 31961100-byte allocation. 

मुझे आश्चर्य है कि यह वास्तविक डिवाइस पर भी हो सकता है या यदि यह एक जीनमोशन बग हो सकता है।

क्या ढेर अधिकतम मैमरी() तक विस्तारित होने की गारंटी है? Runtime.getRuntime() के लिए JavaDoc। फ्रीमेमरी() कहता है कि यह "हो सकता है" विस्तार, जिसका अर्थ है।

long maxMemory = Runtime.getRuntime().maxMemory(); 
long usedMemory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); 
long availableMemory = maxMemory - usedMemory; 

इस कॉल OutOfMemoryError का कारण बनता है:

मैं सिर्फ स्मृति मैं उपयोग कर सकते हैं की राशि की गणना करने के एक realiable तरह से की जरूरत है, यह कैसे मैंने किया, मुझे सही करें यदि मैं गलत हूँ है

// outOptions has an appropriate inSampleSize 
BitmapFactory.decodeStream(inputStream, null, outOptions); 
+0

क्या आपने इस मुद्दे को हल किया? दुर्भाग्य से – KinGPinG

+0

नहीं। कोई विचार? – wkarl

+0

नहीं, मुझे खेद है कि मैं अभी भी इसके साथ काम कर रहा हूं। अगर मुझे कुछ मदद मिलती है तो मैं आपको बता दूंगा। – KinGPinG

उत्तर

5

Out of memory on a 31961100-byte allocation

आपका बिटमैप 32 एम है। बिटमैप स्टोर करने के लिए वीएम 32 एम रैखिक स्थान आवंटित नहीं कर सकता है। हीप खंडित है, इसलिए यदि आपके ढेर में 32 एम फ्री स्पेस है तो भी ऐसी रैखिक जगह आवंटित करना हमेशा संभव नहीं होता है। आप जितनी मेमोरी कर सकते हैं उतनी मेमोरी को मुक्त करने का प्रयास कर सकते हैं और डीकोडिंग स्ट्रीम से पहले जीसी को कॉल कर सकते हैं।

0 बिटमें अपने बिटमैप को डीकोड करने का प्रयास करें। Or process image in parts। यदि आप हमें बताते हैं कि आपको इस छवि की आवश्यकता क्यों है, तो हम आपको बता सकते हैं कि इसे कैसे संभालना है।

+0

मैं पहले से ही नमूना आकार के साथ बिटमैप को डीकोड कर रहा हूं> 1. भागों में छवि को प्रोसेस करना शायद एक विकल्प नहीं है - भले ही मैं इसे हिस्सों में सहेज सकूं, मैं उम्मीद करता हूं कि वहां एक साथ वापस सिलाई करते समय कलाकृतियों की संभावना होगी (सही अगर मैं गलत हूं तो मुझे)। जो मैं वर्तमान में करता हूं वह इसे सर्वर पर अपलोड करने से पहले 1920px की अधिकतम पक्ष लंबाई तक स्केल करता है। – wkarl

+0

आवंटन के लिए उपलब्ध अधिकतम संगत स्थान खोजने का कोई तरीका है? – wkarl

+2

नहीं। इस उत्तर को जांचें: http://stackoverflow.com/questions/3331527/android-resize-a-large-bitmap-file-to-saled-output-file आप छवि को स्केल करने के लिए अलग प्रक्रिया भी बना सकते हैं, यह होगा केवल छवि प्रसंस्करण के लिए एक ही ढेर आकार है। मैनिफेस्ट में userLargeHeap विकल्प को सक्षम करने का प्रयास करें। या धाराओं का उपयोग करके मूल छवि अपलोड करें और इसे सर्वर की तरफ स्केल करें। – Leonidos

1

आप एक 42MB ढेर है जिनमें से 14MB पहले से ही प्रयोग किया जाता है बाहर, 67% (28M) नि: शुल्क है/उपलब्ध

D/dalvikvm(1201): GC_BEFORE_OOM freed 2K, 67% free 14689K/43975K, paused ... 
    E/dalvikvm-heap(1201): Out of memory on a 31961100-byte allocation. 

आप ~ 31 एम (31K नहीं) आवंटित करने की कोशिश कर रहे हैं, जो 28 एम से अधिक है, जिसके परिणामस्वरूप ओओएम है।

जानकारी के लिए dalvikvm memory allocation log message take a look at debugging memory

समझने के लिए कुछ भी नहीं साझा स्मृति उपयोग के बहुत एंड्रॉयड में चल रही है, ठीक से प्रक्रिया स्मृति उपयोग refer this SO question

एंड्रॉयड best practices on efficient bitmap memory management प्रति गणना करने के लिए मदद

+0

42MB में एक कोड स्निपेट जोड़ा है ढेर का वर्तमान आकार, Runtime.getRuntime()। MaxMemory() मुझे 64 मेगाबाइट देता है। मैं इस धारणा के तहत था कि मैं 64 मेगाबाइट तक का उपयोग कर सकता था और ढेर उस आकार तक फैल जाएगा। स्टैक ओवरफ्लो पोस्ट दिलचस्प है लेकिन यह वास्तव में सवाल का जवाब नहीं देता है कि विश्वसनीय रूप से कितनी मेमोरी आवंटित की जा सकती है, इसकी गणना कैसे करें। – wkarl

1

एक आप बात का हो सकता है रोम की फ़ाइल build.props फ़ाइल को ट्विक करने का प्रयास कर सकता है।

Genymotion एमुलेटर पर आप रूट खोल के माध्यम से निम्नलिखित को निष्पादित करने की कोशिश कर सकते हैं:

cat /system/build.prop | grep dalvik 

और यह Dalvik सेटिंग्स के साथ लाइन में प्रदर्शित करेंगे:

dalvik.vm.heapsize=256m 
dalvik.vm.lockprof.threshold=500 
dalvik.vm.stack-trace-file=/data/anr/traces.txt 

और maxmemory भी 268,435,456 बाइट्स के रूप में रिपोर्ट किया जा रहा है एम्यूलेटर पर मैंने प्रयोग किया।

तो, आप इस सेटिंग के साथ खेलने का प्रयास कर सकते हैं। साथ ही, सुनिश्चित करें कि वर्चुअलबॉक्स की सेटिंग्स में आवंटित स्मृति इन मानों के साथ संगत है।

+1

मैं वास्तव में एमुलेटर के बारे में चिंतित नहीं हूं। मैं बस सोच रहा था कि असली उपयोगकर्ता के उपकरणों के साथ वही बात हो सकती है जो खराब होगी। – wkarl

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