मुझे स्मृति लीक का एक बुनियादी ज्ञान है और उनके कारण क्या हो सकते हैं। इसलिए मुझे समझ नहीं आ रहा है कि क्या मुझे अपने कोड में कोई समस्या है या क्या यह गलत सकारात्मक है। मुझे नहीं पता कि परियोजना का कौन सा हिस्सा मुझे साझा करना चाहिए क्योंकि प्रोजेक्ट छोटा नहीं है। लेकिन बस मुझे टिप्पणियों में बताएं और मैं आवश्यक कोड जोड़ दूंगा।
मैं नेविगेशन आर्क घटक का उपयोग करता हूं और MVVM पैटर्न का पालन करता हूं। मैंने LeakCanary लाइब्रेरी को बाद में प्रोजेक्ट के विकास में शामिल किया और स्क्रीन के बीच नेविगेट करने पर यह मुझे तुरंत पूर्व चेतावनी के बारे में चेतावनी देना शुरू कर दिया।
समस्या तब होती है जब मैं बैक स्टैक में टुकड़े जोड़ देता हूं। प्रत्येक जोड़ के टुकड़े के साथ पीछे ढेर करने के लिए बनाए रखा उदाहरणों के काउंटर बढ़ जाती है। जब यह 5 LeakCanary के थ्रेसहोल्ड मान तक पहुँचता है और ढेर को रिपोर्ट करता है।
लेकिन अगर मैं बैक बटन पर क्लिक करता हूं और पिछले स्क्रीन पर लौटता हूं, तो बनाए गए इंस्टेंस के काउंटर कम हो जाते हैं और आखिरकार, जब 1 स्क्रीन पर वापस आते हैं, तो सभी इंस्टेंस इंस्टेंसेस गायब हो जाते हैं।
अगर मैं ढेर विश्लेषण रिपोर्टों को देखता हूं तो यह कहता है कि चर समन्वयकलेयूट जो कि CoordinatorLayout
xml में एक संदर्भ है लीक हो गया है। यदि मैं चर और उसके सभी उपयोग को हटा देता हूं और फिर से ऐप चलाता हूं तो मुझे वही समस्या दिखाई देती है, लेकिन अब एक अन्य चर के साथ जो कि xml में किसी अन्य दृश्य का संदर्भ है। मैंने उन सभी विचारों और उनके उपयोग को हटाने की कोशिश की जो लीककैनरी ने लीक होने की सूचना दी थी। जब यह कहा गया कि एक TextView
, जिसका उपयोग सिर्फ एक पाठ को सेट करने के लिए onViewCreated
किया जाता है और कहीं और उपयोग नहीं किया जाता है, तो मैं लीक कर रहा हूं मुझे संदेह है कि मेरे कोड में कोई समस्या है।
मैंने टुकड़ों में जीवनचक्र पद्धति के कॉलों का विश्लेषण किया और देखा कि जब मैं पिछली विखंडन के लिए नई स्क्रीन पर नेविगेट करता हूं, तब तक सभी विधियों onDestroyView
को कॉल किया जाता है और इसमें कॉल भी जाता है लेकिन नहीं onDestroy
। जब मैं वापस क्लिक करता हूं तो onDestroy
उस खंड के लिए कॉल किया जाता है जो बैक स्टैक के शीर्ष पर था और बनाए गए उदाहरण काउंटर घट जाते हैं।
मुझे संदेह है कि नेविगेशन घटक एक खंड का उदाहरण रख रहा है जब यह बैक स्टैक में है और लीककैनरी इसे लीक के रूप में देख रहा है।
onDestroyView
से व्यू बाइंडिंग के साथ 'शून्य' हो गया है ।