前言
内存溢出(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倍的内存空间。