मैं विचार बनाते समय संदर्भ/गतिविधि मेमोरी लीक को रोकने के लिए सर्वोत्तम प्रथाओं पर अध्ययन कर रहा हूं, और मुझे यह निश्चित जानकारी नहीं मिल रही है कि क्या है या इसकी अनुमति नहीं है कक्षाओं में स्थिर क्षेत्रों के लिए आता है।एंड्रॉइड: स्टेटिक फ़ील्ड्स और मेमोरी लीक्स
public class MyOuterClass extends Activity{
private MyInnerClass;
MyInnerClass = (MyInnerClass) findViewById(<XML call here>);
MyInnerClass.myXInt = 3;
// onCreate(), onResume(), etc.
public static class MyInnerClass extends SurfaceView implements Runnable{
// Safe variables?
private static int myXInt, myYInt;
private static boolean myBoolean;
// Potentially safe?
private static Canvas myCanvas;
// Definitely bad.
private static Context myContext;
public MyInnerClass(Context context){
myContext = context; // This is bad.
}
}
}
मैं थोड़ा क्या JVM वास्तव में MyInnerClass के लिए classloader मानता है पर उलझन में हूँ:
चलो कहते हैं कि मैं इस फॉर्म की एक कोड करते हैं। तकनीकी रूप से, चूंकि यह एक SurfaceView ऑब्जेक्ट है, ऐसा लगता है कि एप्लिकेशन ने MyInnerClass को एक बार तुरंत चालू करने के बाद स्थिर चर हमेशा मौजूद होना चाहिए (जो तब होता है जब दृश्य पहली बार फुलाया जाता है), और फिर तब तक वहां रहें जब तक कि एप्लिकेशन स्वयं समाप्त नहीं हो जाता। यदि ऐसा है, तो बिटमैप्स और कैनवास ऑब्जेक्ट्स को भी खुले रहने और ढेर को भरने से क्या रोकता है?
एकमात्र कथन जो मैंने कभी बार-बार देखा है, यह है कि आप स्थिर संदर्भ को रिसाव नहीं कर सकते जैसे कि मैंने कन्स्ट्रक्टर में दिखाया है, लेकिन यह उससे परे कभी नहीं जाता है। क्या यह वास्तव में एकमात्र चीज है जिसे आप नहीं कर सकते?
आपके 'कैनवास' आदि को 'स्थिर 'होने की आवश्यकता नहीं है। इस तरह यह वास्तव में हमेशा के लिए ढेर में रहेंगे – zapl
यदि ऐसा है तो क्या स्थिरता (यानी - निजी स्थैतिक अंतिम int MY_CONSTANT) को रोकता है, जो किसी भी वर्ग को गतिविधि (और इसके संदर्भ) को खोलता है? – SeaNick