मैं लगातार स्मृति रिसाव की पहचान के साथ संघर्ष कर रहा हूं। मुझे लगता है कि मेरे प्रोजेक्ट circular progress view में कई मेमोरी लीक हैं।व्यावहारिक उदाहरण में मेमोरी लीक
मेरे अनुमानों में से एक है कि मेरे पास आंतरिक कक्षा FadeRunnable
में मेमोरी लीक है। लेकिन ईमानदार होने के लिए मुझे नहीं पता कि यह कैसे पता लगाना है कि यह वास्तव में समस्या का स्रोत है या नहीं। खैर, जब मैं सामान्य परिदृश्य करता हूं और अभिविन्यास स्विच करता हूं तो मुझे नीचे दिखाए गए स्मृति उपयोग में वृद्धि दिखाई देती है। और अगर मैं FadeRunnable
वर्ग के उपयोग बाहर टिप्पणी चरणों में छोटे होते हैं (लेकिन अभी भी वहाँ है, इसलिए मुझे लगता है कि यह है कि केवल रिसाव नहीं है)
एक बार मैं हीप डंप का विश्लेषण, मैं कुछ देख । लेकिन वास्तव में मुझे नहीं पता कि मूल्यों का क्या अर्थ है। बातें मुझे क्या करना
- उन्मुखीकरण बदलें है। मुझे लगता है कि इसका मतलब यह है की 'CircularProgressView' लीक और कहीं स्मृति में अनाथ के रूप में रहने वाले।
यह सही? मैं कहीं लगता है कि यदि हां, तो मैं कैसे डंप जानकारी में पता कर सकते हैं (है 8 उदाहरणों देखते हैं निचला फलक) जहां यह वस्तु सहेजी/आयोजित की जाती है।
मैं एक कदम-दर-कदम विवरण पता लगाने के लिए अगर और जो वस्तु कुछ स्मृति लीक कर रहा है अच्छा लगेगा।
संदिग्ध दृश्य के सभी कोड इस कक्षा में पाए जा सकते हैं।
लेकिन यह भी गहन जानकारी के लिए पूरी परियोजना की जाँच करने के लिए स्वतंत्र लग रहा है और आप इसके साथ चारों ओर खेलने के लिए चाहते हैं।
अग्रिम धन्यवाद!
अद्यतन
ऊपर से कोड लिंक मेम-लीक भीतरी वर्ग की नियत कोड को दर्शाता है। निम्नलिखित स्निपेट मूल मेम-लीक कोड है कि
/**
* Mem-leaking code, for fixed code see repository link
* https://github.com/momentummodules/CircularProgressView/blob/master/circularprogressview/src/main/java/momentum/circularprogressview/CircularProgressView.java
*/
public class CircularProgressView extends View
{
...
private Thread fadeThread = null;
...
...
class FadeRunnable implements Runnable
{
@Override
public void run()
{
...
}
}
...
...
private void startFade(boolean fadeIn)
{
// check existing
if(this.fadeThread != null)
{
// check if fade is already running
switch(this.fadeThread.getState())
{
case TERMINATED:
case NEW:
this.fadeThread = null;
break;
case RUNNABLE:
case BLOCKED:
case TIMED_WAITING:
case WAITING:
return;
}
}
// create new
this.fadeThread = new Thread(new FadeRunnable(fadeIn, this.fadeTime));
this.fadeThread.start();
}
}
मैं लीक कैनरी लाइब्रेरी से शुरू करने की अनुशंसा करता हूं: https://github.com/square/leakcanary। यदि आप संदर्भ रिसाव करते हैं तो बॉक्स को एकीकृत और बाहर करना बेहद आसान है। –
हां, इसे पहले से ही मेरी बड़ी परियोजनाओं के लिए उपयोग करें। लेकिन वास्तव में मुझे तीसरे पक्ष के lib पर भरोसा करने की बजाय पूरी चीज को समझने में दिलचस्पी है! –