Android 内存泄漏

内存泄漏:指由于疏忽或错误造成程序未能释放已经不再使用的。

内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。


Android中造成内存泄漏的原因有以下几点:

1、static activity

public class MainActivity extends AppCompatActivity {
    private static MainActivity activity;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        activity=this;
    }
}

其中 activity 是静态的,App在运行时会一直存在,现在错误的把它指向MainActivity,即造成MainActivity无法被GC回收,从而造成内存泄漏。

2、static view

public class MainActivity extends AppCompatActivity {
    private static TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv=findViewById(R.id.tv_1);
    }
}

代码中TextVew 含有Context上下文,当Context 指向MainAcitivy时,就会造成MainActivity无法被回收,引起泄漏。

3、内部类

public class MainActivity extends AppCompatActivity {
    private static InnerClass innerClass;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        innerClass=new InnerClass();
    }
    class InnerClass{

    }
}

内部类含有对外部类的引用,从而造成内存泄漏

4、匿名类(AsyncTask、Handler、Thread等)

  new AsyncTask(){
            @Override
            protected Void doInBackground(Void... voids) {
                while (true){
                }
            }
        }.execute();

匿名类含有对外面类的引用,如果后台任务还没执行完成、或者队列中还有任务没执行,即造成内存泄漏。

参考 http://blog.nimbledroid.com/2016/05/23/memory-leaks.html

你可能感兴趣的:(Android 内存泄漏)