内存溢出和内存泄露的区别以及如何避免内存溢出

本文翻译自The difference between memory overflow and memory leak and how to avoid memory overflow,稍加改动,如有侵权,及时私信。

内存溢出:程序申请内存时已没有足够的内存空间供其使用,出现内存溢出。

内存溢出是你要求分配的内存超过系统给你的,系统不满足要求,导致溢出。

内存泄漏:程序在申请内存时,无法释放所请求的内存空间。内存泄漏的危害可以忽略不计,但是内存泄漏累积的后果较为严重,因为不管内存有多少,迟早会用完。

内存泄漏是当你向系统申请分配内存使用(new),但是使用后没有返回(delete),你申请的那块内存的结果就不能再访问了(可能你已经丢失了它的地址),并且系统无法将其分配给所需的程序。

内存泄漏最终会导致内存溢出。

按照发生的方式,内存泄漏可以分为4类:

  • 频繁的内存泄漏:有内存泄漏的代码会被多次执行,每次执行都会导致内存泄漏。
  • 意外的内存泄漏:发生内存泄漏的代码仅在某些情况或过程中发生。频繁和偶然是相对的。对于给定的环境,偶尔可能会变成频繁发生。因此测试环境和测试方法对于检测内存泄漏至关重要。
  • 一次性内存泄漏:内存泄漏的代码只执行一次,或因算法缺陷,总会出现单次内存泄漏。例如,在类的构造函数中分配内存而未在析构函数中释放该内存,造成内存发生一次泄漏。
  • 隐式内存泄漏:程序在运行时不断分配内存,但直到结束才释放内存。严格来说,这未造成内存泄漏,因为程序最终释放了所有请求的内存。但是对于服务器程序,可能需要数天、数周或数月才能耗尽内存,从而导致溢出。因此,我们称这种内存泄漏为隐式内存泄漏。

从用户的角度来看,内存泄漏本身不会产生任何危害,一般不会感觉到内存泄漏。真正危害的是内存泄漏的累积,最终消耗掉系统的所有内存。从这个意义上说,一次性内存泄漏是无害的,因为它不会累积,而隐式内存泄漏是非常有害的,因为它比频繁和意外的内存泄漏更难检测


避免内存溢出

OOM(out of Memory),一般是程序员错误编写代码导致。根本的解决方案是优化你的代码:对内存引用做一些处理,使用软引用、弱引用和虚引用,在内存中加载图片时直接在内存中做处理,比如边界压缩,建立动态回收内存机制,优化Dalvik虚拟机的堆内存分配,自定义堆内存大小等

1.数据库的游标没有关闭

2.构造适配器不使用缓存Converview

3.调用Registerreceiver后不调用unregisterreceiver

4.输入流/输出流未关闭

5.Bitmap使用recycle未调用

6.上下文泄漏

7.static关键字等

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值