2012-09-15 19 views
7

मैं कई बड़े ड्रॉबल्स के साथ काम करता हूं और मुझे नहीं पता कि मेमोरी लीक कैसे प्रबंधित करें। मैंने अपने आवेदन के ढेर आकार को ट्रैक किया और यह बढ़ने से नहीं रोकता (आवंटित स्मृति के रूप में)।एंड्रॉइड ड्रायबल्स मेमोरी लीक

यह विशेष रूप से "बाइट सरणी (बाइट [])" प्रकार है जो बढ़ता है और कभी कम नहीं होता है। (ग्रहण पर डीडीएमएस हीप व्यू में)

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

वास्तव में, हर बार जब मैं कॉल करता हूं: Drawable.createFromResourceStream (context.getResources(), मान, नया FileInputStream (f), f.getName(), opts); ढेर बढ़ता है। मैं स्मृति कैसे मुक्त कर सकता हूं?

धन्यवाद!

उत्तर

6

एक स्मृति रिसाव तब होती है जब जावा स्मृति में वस्तुओं को पाता है जो आपके कोड द्वारा संदर्भित हैं जो कचरा कलेक्टर को इस स्मृति को मुक्त करने से रोक रहा है। एंड्रॉइड में एक आम कारण अनुप्रयोग संदर्भ के बजाय गतिविधि संदर्भ का संदर्भ दे रहा है। सुनिश्चित करें कि आपके संदर्भ को संदर्भित आवेदन बनाने (यानी बल्कि this का उपयोग करने से getApplicationContext का उपयोग करें। मेमोरी लीक पर स्पष्टीकरण के लिए इस video चेक करें और यह भी जाँच इस question

+0

मैं आवेदन संदर्भ और नहीं गतिविधि संदर्भ संदर्भ, आपको लगता है मुद्दा यह है कि मेरे टुकड़े को नष्ट कर दिया कभी नहीं रहे हैं और वे रिसाव है? – abecker

+0

हो सकता है कि –

+1

लीक करने वाली ऑब्जेक्ट्स को ढूंढने के लिए एसडीके मेमोरी विश्लेषण टूल (MAT) का उपयोग करने के तरीके के बारे में मेरे उत्तर में वीडियो देखें, हे! मैंने अपना मुद्दा हल किया! वास्तव में, मेरे टुकड़े स्मृति में रखा गया था और यह मेरे स्थिर अस्थिर कैश था जो इसे रखा था। मुझे सच में नहीं पता कि यह व्यवहार क्यों है। मैंने एक DrawableManager को इंस्टाल किया, जब मैं एक टुकड़ा बनाता हूं, जिसमें डिस्क से या नेटवर्किंग द्वारा ड्रायबल्स को पुनर्प्राप्त करने के कई तरीके हैं। जब यह मेरे विचारों में से एक को वितरित करता है, तो यह इसे एक स्थिर हैश मैप में रख रहा था (इस कैश को मेरे अन्य टुकड़ों में पुन: उपयोग करने के लिए)। मैं बस अपना हैश मैप कोई स्थिर नहीं करता (टुकड़ों के बीच अस्थिर कैश का पुन: उपयोग नहीं कर सकता)। मुझे नहीं पता कि मेरा टुकड़ा स्मृति में क्यों रखा गया था। – abecker

2

सवाल का जवाब लगता है, लेकिन रोमेन लड़का द्वारा एक पोस्ट में अधिक जानकारी प्राप्त करने के लिए प्रासंगिक लगती है :। Avoiding Memory Leaks

जाहिर है, आप (उदाहरण के लिए) setBackgroundDrawable * (इस प्रकार देखने के लिए drawable संलग्न) का उपयोग कर एक पाठ को देखने के लिए एक पृष्ठभूमि छवि के रूप में एक drawable निर्धारित करते हैं तो अभिविन्यास (गतिविधि को नष्ट करने और redrawing बदल यूआई) ड्रॉबल के पास अभी भी पुरानी गतिविधि (पुरानी गतिविधि के विनाश के बाद) तक पहुंच होगी, इस प्रकार मेमोरी लीक बनायेगा।

* (एक तरफ ध्यान दें के रूप में - setBackgroundDrawable deprecated since API level 16 किया गया है)

+0

... और फिर भी सेटबैकग्राउंड ड्रायबल को अभी भी एपीआई 24 में सेटबैकग्राउंड द्वारा आंतरिक रूप से भी बुलाया जाता है। :) –

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