2015-12-14 6 views
7

मुझे संभावित मेमोरी लीक खोजने का प्रयास करने में कठिनाई हो रही है। मुझे एक गतिविधि मिली है जो पृष्ठभूमि में कुछ भारी काम कर रही है।एंड्रॉइड स्टूडियो कचरा कलेक्टर कैसे शुरू करता है और यह कैसे काम करता है?

कुछ कार्यों के बाद, ऐप बहुत अधिक स्मृति का उपभोग करता है। ऐसा लगता है कि यह ठीक से साफ नहीं किया जाता है।

enter image description here

अगर मैं काम जो गतिविधि कर रही है चलाने के लिए, अधिक से अधिक स्मृति आवंटित होता है,

यह डिफ़ॉल्ट राज्य में गतिविधि है। कुछ काम के बाद

गतिविधि: enter image description here

पहले तो मुझे लगा कि यह, एक मेमोरी मुद्दा होना चाहिए जीसी कारण नहीं ठीक से मेमोरी खाली कर सकते हैं। जहां तक ​​मुझे पता है, ऑब्जेक्ट्स के लिए कोई संदर्भ नहीं छोड़ा गया है, तो जीसी स्मृति को मुक्त कर सकता है। क्या वो सही है?

अब आता हिस्सा जो मुझे confuses:

अगर मैं एंड्रॉयड स्टूडियो से जीसी चलाने के लिए, स्मृति ठीक तरह से साफ किया जाता है और मेरे गतिविधि कभी नहीं बंद कर दिया जाता है। जब मुझे बहुत मेमोरी आवंटित की जाती है तो मुझे बस एंड्रॉइड स्टूडियो जीसी का उपयोग करना होगा। enter image description here

यह एक मेरा मतलब है:

enter image description here

सामान्य में सवाल यह है:

क्यों एंड्रॉयड स्टूडियो जीसी ठीक से स्मृति को साफ कर सकते हैं और क्यों नहीं करता है यह स्वचालित एंड्रॉइड जीसी के साथ ठीक से काम करता है?

मुझे पता है कि यह एक सुंदर सामान्य प्रश्न है। मैं सिर्फ जानना चाहता हूं, अगर विभिन्न प्रकार के कचरे के संग्रह या ऐसा कुछ है।

System.gc(); पर कॉल करने से स्मृति को ठीक से साफ नहीं किया जाता है।

अतिरिक्त जानकारी:

मोटो जी 2 जनरल

एंड्रॉयड 5.0.2।

+0

"कभी कभी, गतिविधि या एप्लिकेशन बंद कर देता है। मैंने सोचा कि यह स्मृति समस्याओं की वजह से हो सकता है।" यदि ऐप बी/सी मर जाता है तो यह स्मृति से बाहर हो जाता है, आपको आउट-ऑफ-मेमोरी अपवाद मिलेगा जिसे आप स्पष्ट रूप से लॉगकैट में देख सकते हैं। मेरा झुकाव यह है कि आपका ऐप किसी अन्य कारण से दुर्घटनाग्रस्त हो रहा है। क्रैश कारण क्या है यह देखने के लिए लॉगकैट को देखने का प्रयास करें। – Shmuel

+1

समवर्ती जीसी केवल ध्यान देने योग्य विरामों का कारण नहीं बनने के लिए आंशिक संग्रह करता है। स्पष्ट जीसी जैसे स्टूडियो द्वारा ट्रिगर किया गया एक पूर्ण जीसी स्वीप करता है। कुछ पढ़ना: https://source.android.com/devices/tech/dalvik/gc-debug.html – laalto

+0

@Shmuel अपवाद नहीं हैं। चेतावनी भी नहीं। – FlanschiFox

उत्तर

2

शायद आप अपने भारी प्रोसेसिंग कोड में समय-समय पर System.gc(); को स्पष्ट रूप से कॉल करने का प्रयास कर सकते हैं?

+0

क्षमा करें मैं इसे भूल गया। मैंने कोशिश की है कि यह काम करता है और यह काम नहीं करता है। – FlanschiFox

+0

यदि वास्तव में एक स्मृति रिसाव है तो System.gc() को कॉल करने में मदद नहीं होगी b/c स्मृति को कोड में कहीं भी संदर्भ के माध्यम से रखा जाएगा। – Shmuel

+0

@Shmuel यह सच है, लेकिन ओ पी एप्लिकेशन क्रैश नहीं होता, जब वह एंड्रॉयड स्टूडियो पर जीसी बटन, जो मुझे लगता है 'System.gc()', इसलिए मेरी सुझाव के लिए एक कॉल कर रहा है प्रेस कहते हैं। –

4

मेमोरी लीक कई कारणों से हो सकता है। एक आम कारण बिटमैप्स हैं जिन्हें सही ढंग से पुनर्नवीनीकरण नहीं किया जाता है। स्मृति लीक के अन्य बीज वस्तुओं में संदर्भ रखते हैं। उदाहरण के लिए आप एक async कार्य लॉन्च करते हैं और एक संदर्भ पास करते हैं क्योंकि आपको बाद में इसकी आवश्यकता होती है। जबकि async कार्य चल रहा है, यह संदर्भ का संदर्भ रखता है और इसलिए पूरी गतिविधि स्मृति में है। यह अज्ञात और आंतरिक कक्षाओं के साथ भी अक्सर होता है, जिसमें मूल वर्ग का संदर्भ होता है जो आम तौर पर एक टुकड़ा या गतिविधि होता है।

मैं सुझाव है कि आप मेमोरी लीक पहचानना पुस्तकालय रिसाव कनारी का उपयोग करें और कहां स्मृति रिसाव हो रहा है की खोज करने के लिए आवंटन को ट्रैक करने के एंड्रॉयड उपकरणों का उपयोग करने के लिए।

+0

उत्तर के लिए धन्यवाद। आपने सामान्य कारणों का उल्लेख किया है, मेमोरी लीक कैसे होती है। असल में यह शेष संदर्भों का सही कारण है। लेकिन मेरे मामले में, एंड्रॉइड स्टूडियो जीसी कॉल सब कुछ ठीक से साफ कर रहा है। तो अगर कुछ अजीब संदर्भ हो, तो जीसी उन्हें सही तरीके से साफ करने में सक्षम नहीं होना चाहिए? – FlanschiFox

+0

बिल्कुल नहीं। आप एक गतिविधि से बाहर निकल सकते हैं लेकिन फिर भी कुछ सेकंड के लिए संदर्भ रखें। तो जब आप कुछ सेकंड के बाद जीसी चलाते हैं तो यह उस स्मृति को साफ कर देगा। मैं क्योंकि शायद एक बिटमैप पुनर्नवीनीकरण किया जा रहा था, स्थितियों में, जहां मैं कई गतिविधियों से वापस जा रहा था और स्मृति अतिप्रवाह है का सामना करना पड़ा और कहा कि स्मृति को मुक्त करने के जीसी देरी है, और इसलिए की स्मृति समाप्त हुआ। डिफ़ॉल्ट रूप से जीसी नहीं मुक्त स्मृति अगर यह आवश्यक नहीं है (यह स्मृति की अधिकतम स्वीकृत संख्या तक पहुँचने नहीं है)। यह आपका दूसरा मुद्दा भी हो सकता है। – jorgemf

+0

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

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