内存溢出和内存泄露

一、简单理解
(1)内存溢出:out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,比如申请了一个integer,给其存放一个long型的数据,就会造成内存溢出。
(2)内存泄露:memory leak,是指程序在申请内存后,无法释放内存,一次泄露的危害可以忽略,但泄露堆积会很严重,无论多少内存,内存迟早会被占光的。
(3)内存泄露最终会造成内存溢出。
二、内存泄漏的分类
(1)常发性的内存泄露。发生泄露的代码,多次被执行。比如,在循环中发送了内存泄露。
(2)偶发性的内存泄露。发生泄露的代码,在特定的环境下被执行。
(3)一次性的内存泄露。发送泄露的代码,就发生一次。或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。
(4)隐式的内存泄露。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。
三、防止发生内存泄露的几个方法
(1)在哪里引用就在哪里声明对象。比如new()一个新的对象,如果别的地方没有引用它,当它超出它的作用域时,它就会被GC回收机制回收。
(2)在屏幕旋转时,会破坏当前保持的一个Activity状态,并且重新申请生成新的Activity,直到新的Activity状态被保存。我们如果不想让它生成一个新的Activity,在AndroidManifest.xml中,
配置属性:android:configChanges=”orientation|screenSize”
或者android:screenOrientation=”portrait” 限制activity为竖屏。
(3)不要为Context长期保存引用(要引用Context就要使得引用对象和它本身的生命周期保持一致)。如果要使用到Context,尽量使用ApplicationContext去代替Context,因为ApplicationContext的生命周期较长,引用情况下不会造成内存泄露问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值