title: Android : Static Fields and Memory Leaks
body: <p>I've been studying up on best practices for preventing Context/Activity memory leaks when creating views, and I can't seem to find a definite answer on what is or is not allowed when it comes to static fields in classes.</p>
  
  <p>Let's say I have a code of this form:</p>
  
  <pre><code>public class MyOuterClass extends Activity{
     private MyInnerClass;
     MyInnerClass = (MyInnerClass) findViewById(&lt;XML call here&gt;);
     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.
        }
     }
  }
  </code></pre>
  
  <p>I am slightly confused on what the JVM actually considers the ClassLoader for MyInnerClass. Technically, since it is a SurfaceView object, it seems like the static variables should always exist once the application has instantiated MyInnerClass one time (which happens when the View is first inflated), and then remain there until the application itself is terminated. If that is the case, what prevents Bitmaps and Canvas objects from remaining open as well and filling up the heap?</p>
  
  <p>The only statement I ever see repeated over and over is that you can't leak static Context like I have shown in the constructor, but it never goes beyond that. Is that really the only thing you can't do?</p>