मुझे लगता है कि मेरे एंड्रॉइड लाइव वॉलपेपर में मेमोरी लीक है। जब भी मैं स्क्रीन घुमाता हूं, एकत्रित मेमोरी कचरा की मात्रा 50kb तक बढ़ जाती है और वापस नहीं जाती है। मुझे लगता है कि यह एक निर्धारित भविष्य के कारण हो सकता है, इसलिए मैं यह देखने के लिए एक परिदृश्य पेश करने जा रहा हूं कि यह मामला है या नहीं।क्या एक निर्धारित भविष्य मेमोरी रिसाव का कारण बन सकता है?
मान लें कि आपके पास एक कक्षा है (चलिए इसे फू कहते हैं) जिसमें निम्नलिखित सदस्य हैं।
private ScheduledFuture<?> future;
private final ScheduledExecutorService scheduler = Executors
.newSingleThreadScheduledExecutor();
private final Runnable runnable = new Runnable() {
public void run() {
// Do stuff
}
};
और अब आप एक अनुसूचित भविष्य
future = scheduler.scheduleAtFixedRate(runnable, delay, speed,
TimeUnit.MILLISECONDS);
भविष्य runnable के लिए एक संदर्भ रखती है निर्धारित करते हैं, और runnable माता पिता फू ऑब्जेक्ट के संदर्भ रखती है। मुझे यकीन नहीं है कि यह मामला है, लेकिन क्या इस तथ्य का अर्थ यह हो सकता है कि यदि कार्यक्रम में कुछ भी फू का संदर्भ नहीं रखता है, तो कचरा कलेक्टर अभी भी इसे एकत्र नहीं कर सकता क्योंकि एक निर्धारित भविष्य है? मैं मल्टीथ्रेडिंग पर बहुत अच्छा नहीं हूं, इसलिए मुझे नहीं पता कि मैंने जो कोड दिखाया है, उसका मतलब है कि निर्धारित कार्य ऑब्जेक्ट से अधिक समय तक जीवित रहेगा, जिसका अर्थ है कि यह कचरा एकत्र नहीं होगा।
यदि इस परिदृश्य से फू को कचरा संग्रह होने से रोका नहीं जायेगा, तो मुझे बस एक सरल स्पष्टीकरण के साथ कहा जाना चाहिए। अगर यह फू को कचरा होने से रोकता है, तो मैं इसे कैसे ठीक करूं? future.cancel(true); future = null;
करना है? future = null
हिस्सा अनावश्यक है?
मेरी रन विधि संलग्न फू क्लास पर भरोसा करती है। लेकिन जब मैं फू ऑब्जेक्ट के संदर्भ को नष्ट कर देता हूं, तो मुझे स्मृति रिसाव के कारण चलने योग्य को रोकने के लिए क्या करना होगा। क्या 'भविष्य.cancel (सत्य) 'पर्याप्त होगा? मैं पहले से ही कर रहा हूं और स्मृति रिसाव अभी भी वहां है। बेशक, इसका मतलब यह हो सकता है कि रननेबल रिसाव का स्रोत नहीं है। – gsingh2011
@ gsingh2011 क्या आप वाकई सुनिश्चित हैं कि 'भविष्य.cancel (true)' आपके भविष्य को रद्द कर देता है? दूसरे शब्दों में, क्या आपके रननेबल को बाधित किया जा सकता है और जब यह बाधित होता है तो क्या यह अपना काम समाप्त कर देता है? – assylias
चूंकि मुझे समझ में नहीं आता कि "क्या आपके रननेबल को बाधित किया जा सकता है" मुझे लगता है कि इसे बाधित नहीं किया जा सकता है। मुझे यह कैसे करना चाहिए? – gsingh2011