2012-03-11 20 views
53

का कारण ढूंढना और उपचार करना मैं काम करने की कोशिश कर रहा हूं कि मेरा ऐप इतना मेमोरी क्यों उपयोग कर रहा है। मैं अक्सर इसे 15 से 18 एमबी के बीच देखता हूं, जो अपेक्षा करता है उससे काफी अधिक है। मैं डी डी एम एस के माध्यम से ढेर आकार पर एक नज़र लिया और यह देखा:बड़े ढेर आकार

enter image description here

कि एक बालक suspicous देखा क्योंकि मेरे एप्लिकेशन को सभी में बड़ी छवियों से निपटने के नहीं है। असल में मेरे ऐप में ड्रॉबल्स की कुल योग लगभग 250 केबी है। तो मैंने एक ढेर डंप बनाया और यह पता लगाने के लिए मैट का इस्तेमाल किया जहां यह सारी याददाश्त चल रही थी। बाइट [] सरणियों दूर सबसे बड़ी उपभोक्ता द्वारा थे, तो मैं नीचे drilled और चला है कि निम्न:

enter image description here

मैं बिल्कुल पता नहीं है क्यों sPreloadedDrawables इस तरह के एक उच्च बनाए रखा ढेर आकार के लिए जिम्मेदार है। मुझे यह भी पता नहीं है कि मूल कारण की पहचान कैसे करें, या इसे कैसे ठीक करें।

मुझे यहां से कहाँ जाना चाहिए? मेरा ऐप ज्यादातर उन सेवाओं के माध्यम से पृष्ठभूमि में काम करता है जो छवि डेटा से बिल्कुल निपट नहीं पाते हैं। मेरे पास ऐसी गतिविधियां हैं जो उपयोगकर्ता उपयोग करने का विकल्प चुन सकते हैं, लेकिन फिर से, वे छोटे ड्रॉबल्स का उपयोग करते हैं जो इस तरह के बड़े ढेर आकार की व्याख्या नहीं करते हैं। मैंने गतिविधि लीक इत्यादि की किसी भी ग़लत घटनाओं के लिए भी जांच की, लेकिन किसी का पता नहीं लगा।

संपादित करें: मैंने देखा है कि एमुलेटर में चलाने पर ढेर का आकार काफी कम है। यह काफी उलझन में है। :/

+1

आप कौन सा एंड्रॉइड संस्करण चल रहे हैं? मैंने देखा कि आईसीएस छवि ड्रॉबल्स को प्रीलोड करता है, मुझे लगता है कि एक आसान UI अनुभव है और बढ़ी हुई वीएम मेमोरी सीमा का लाभ उठाएं। तो यदि आपका फोन आईसीएस पर है और आपका एमुलेटर 2.X पर है जो अंतर को समझाएगा। मैंने व्यक्तिगत रूप से एमुलेटर का परीक्षण नहीं किया है 4.X यह जांचने के लिए कि क्या फुलाया गया स्मृति भी मौजूद है (मुझे लगता है कि बाद में मेरे लिए कुछ करना है)। यह निश्चित रूप से मेरे फोन पर 4.0.3 चल रहा है। – sciutand

+0

मेरा फोन स्टॉक एंड्रॉइड 4.0.3 चला रहा है, जैसा कि एमुलेटर है। – Glitch

+0

आप एमुलेटर बनाम डिवाइस पर किस स्क्रीन घनत्व/आकार का उपयोग कर रहे हैं? – cistearns

उत्तर

44

सिस्टम डिफ़ॉल्ट सिस्टम संसाधनों को प्रीलोड करेगा, यह आपके ऐप संसाधनों से स्वतंत्र है, चेक बॉक्स और रेडियो बटन के लिए मानक ड्रायबल्स जैसी चीज़ें। 10.5 एमबी बड़ा प्रतीत होता है लेकिन बहुत सारे डिफ़ॉल्ट सिस्टम संसाधन हैं और स्मृति में संग्रहीत छवियों को बड़ा कर दिया जाता है। प्रीलोडिंग नया नहीं है, लेकिन आईसीएस में प्रीलोड का आकार बड़ा हो सकता है। प्रदर्शन घनत्व शायद आईसीएस में प्रीलोड किए गए अधिक सिस्टम ड्रायबल्स के अतिरिक्त के साथ इसमें एक हिस्सा निभाता है।

वर्तमान में स्मृति द्वारा आयोजित कम करने के लिए कोई तरीका नहीं है sPreloadedDrawables

यह इस खाली करने के लिए एक तरीका नहीं है कि उसके बाद एप्लिकेशन प्रक्रिया क्षुधा (विशेष रूप से खेल) कि नहीं है के लिए पैदा की है दुर्भाग्य की बात है अधिकांश सिस्टम Drawables का उपयोग करें। इस मामले में हालांकि प्रीलोड संसाधनों का बड़ा आकार आईसीएस के एक विशिष्ट रिलीज (या हैंडसेट पोर्ट) के साथ एक बग रहा है। यह अन्यथा सामान्य रूप से स्मृति की एक छोटी राशि है, इसलिए मुझे संदेह है कि प्रीलोड लोड करने के उपयोग को कम करने के लिए ऐसी तंत्र रखना आवश्यक होगा।

यदि आप इस कैश के परिणामस्वरूप स्मृति से बाहर हो रहे हैं तो शायद मैं Google को एक बग रिपोर्ट दर्ज करूंगा।

यदि आप अधिक आंतरिक विवरण में रुचि रखते हैं तो आप यहां संसाधन प्रीलोड प्रक्रिया के माध्यम से पता लगा सकते हैं। ZygoteInit.preloadResources

+4

हाँ के रूप में चल रहा है। इसे बंद करने के लिए कोई सुविधा नहीं होगी - यह ज़ीगोट प्रक्रिया में किया जाता है, जिसे एक बार बनाया जाता है, और जो सभी ऐप प्रक्रियाएं उत्पन्न होती हैं।इस संसाधन को लोड करने वाले संसाधनों को इस प्रकार सभी प्रक्रियाओं में साझा किया जाता है। – hackbod

+0

धन्यवाद cistearns। मेरा मुख्य मुद्दा यह है कि मेरे पास उपयोगकर्ता इस स्मृति उपयोग को देख रहा है, और इसकी रिपोर्टिंग कर रहा है। यह मेरी स्टार रेटिंग को प्रभावित कर रहा है। मेरा फोन आईफोन 4 के समान प्रदर्शन का उपयोग करता है, इसलिए यह बहुत अधिक घनत्व है (320 डीपीआई की तरह कुछ)। स्टॉक आईसीएस पर यह एंड्रॉइड द्वारा रिपोर्ट किए गए 20 एमबी के ऊपर का उपयोग करेगा। दिलचस्प बात यह है कि बाद के निर्माण में अपडेट करने के बाद, यह लगभग 7 एमबी तक गिर गया है। तो मैं सोच रहा हूं, क्या यह एक खराब स्टॉक आईसीएस पोर्ट का उत्पाद भी हो सकता है? – Glitch

+1

लगता है जैसे यह एक बग था जो अधिक से अधिक (या बड़ी) वस्तुओं को प्रीलोड के दौरान लोड होने के कारण लोड कर रहा था। @ हैकबोड मैंने ज़ीगोट में पूरी तरह से खोला नहीं था यह देखने के लिए कि इसे स्पॉनर (बहुत ठंडा) के रूप में इस्तेमाल किया गया था, इसलिए मुझे लगता है कि प्रीलोड को हमेशा क्यों होने की आवश्यकता है। कांटा के बाद प्रीलोड संसाधनों को साफ़ करने के लिए समर्थन जोड़ना संभव होगा। लेकिन यह देखते हुए कि बड़ा आकार एक बग रहा है और यह सामान्य रूप से छोटा है, मुझे संदेह है कि यह कभी भी आवश्यक होगा। – cistearns

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