内存泄漏和内存溢出

Android之内存泄漏和内存溢出的区别以及处理方法

  • 内存泄漏和内存溢出的定义
    • 内存泄漏(Memory Leak)的含义
    • 内存溢出(Out of Memory)的含义
    • 两者区别
    • 发生的原因和解决方法

内存泄漏和内存溢出的定义

内存泄漏(Memory Leak)的含义

当一个对象不在使用了,本应该被垃圾回收器(JVM)回收。但是这个对象由于被其他正在使用的对象所持有,造成无法被回收的结果。内存泄漏最终会导致内存溢出。

内存溢出(Out of Memory)的含义

系统会给每个APP分配内存也就是Heap Size值。当APP占用的内存加上我们申请的内存资源超过了Dalvik虚拟机的最大内存时就会抛出的Out Of Memory异常。

两者区别

严格意义上来说,内存的持续泄漏会带来内存溢出,但是内存泄漏不一定会触发内存溢出;
同理,内存溢出不一定就是内存泄漏导致的,因为android系统分配给每一个app的内存空间有限。

发生的原因和解决方法

一、图片、音频、视频的加载资源过重
原因:
大量的图片、音频、视频处理,当在内存比较低的系统上也容易造成内存溢出
解决方法:
使用第三方封装的类库或者JNI来进行处理

二、Bitmap对象的处理
原因:
主线程做了耗时操作;使用Bitmap对象后没有释放回收;图片加载过大或者加载过度频繁
解决方法:
不要在主线程中处理图片;
使用Bitmap对象要用recycle释放;
控制图片的大小,压缩大图,如recyclerview滑动时不要加载图片,滑动结束时再做加载处理

三、资源回收和注销
原因:
BraodcastReceiver,ContentObserver,Cursor,File,Stream,ContentProvider,Bitmap,动画,I/O,数据库,网络的连接等资源的使用,没有在Activity销毁时及时关闭或者注销
解决方法:
回收掉或者销毁掉没有使用的资源
1、广播BraodcastReceiver:记得注销注册unregisterReceiver();
2、文件流File:记得关闭流InputStream / OutputStream.close();
3、数据库游标Cursor:使用后关闭游标cursor.close();
4、图片资源Bitmap:当它不再被使用时,应调用recycle()回收此对象的像素所占用的内存,再赋为null;
5、动画:属性动画或循环动画,在Activity退出时需要停止动画;
6、集合对象及时清理,使得JVM回收:我们通常会把对象存入集合中,当不使用时,清空集合,让相关对象不再被引用;
7、三方库如EventBus,RxJava等在Activity销毁之前没有解除订阅:在Activity中的onDestroy()方法中解除订阅 EventBus.getDefault().unregister(this);

你可能感兴趣的:(super优化方案)