美文网首页
Android 内存泄漏

Android 内存泄漏

作者: Fighting_Sir | 来源:发表于2018-09-18 15:06 被阅读0次

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

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


    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<Void,Void,Void>(){
                @Override
                protected Void doInBackground(Void... voids) {
                    while (true){
                    }
                }
            }.execute();
    

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

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

    相关文章

      网友评论

          本文标题:Android 内存泄漏

          本文链接:https://www.haomeiwen.com/subject/ixoenftx.html