面试必备:内存溢出 内存泄漏

2017-11-03  本文已影响0人  AndryYu

前言

    内存溢出(out of memory):是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,则就是内存溢出。
    内存泄漏(memory leak):是指程序在申请内存后,无法释放已申请的内存空间。一次内存泄漏危害可以忽略,但内存泄漏堆积后果很严重,最终导致耗尽系统所有的内存,出现程序crash。

内存泄漏原因

1. Activity匿名内部类
解决方案:改为静态非匿名内部类即可

2. Activity添加监听器造成Activity内存泄漏
解决方案:在onDestory方法调用释放监听器

3. Handler 匿名内部类造成内存溢出
解决方案
    使用弱引用(WeakReference)
    使用静态内部类
    在onDestory()方法释放资源

  @Override
    protected void onDestroy() {
        super.onDestroy();
       //如果参数为null的话,会将所有的Callbacks和Messages全部清除掉。
        handler.removeCallbacksAndMessages( null );
    }

4. AsyncTask造成内存泄漏
解决方案
    自定义静态AsyncTask类
    AsyncTask的周期和Activity周期保持一致。也就是在Activity生命周期结束时要将AsyncTask cancel掉。

   @Override
    protected void onDestroy() {
        super.onDestroy();
 
        //取消异步任务
        if ( myTask != null ){
            myTask.cancel(true ) ;
        }
    }

5. Bitmap的处理
解决方案: 对bitmap进行压缩;不用的时候调用 recycle(),把他清理掉 ;Lrucache处理图片
6 不要使用Enum
enum中的每一个值其实都是一个Object对象,每声明一个值就会创建一部分的内存以使它能够被引用到这个对象,相比于静态常量,enum会花费近2倍的内存空间。

参考文献
1.Android 如何有效的解决内存泄漏的问题

上一篇 下一篇

猜你喜欢

热点阅读