内存泄漏和内存溢出

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

内存泄漏(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);

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值