很早就想写这篇博客,一直没有时间,开篇一句话概括两者的关系:内存泄漏导致内存溢出 ;
那就先说一下内存泄漏吧,某一个位置的内存泄漏,或者说导致一次内存泄漏没有什么大的影响,但是累积起来多了,那就造成了OOM内存溢出的错误了,那么什么是内存泄漏呢换句话说什么能导致内存泄漏呢,怎样避免内存泄漏呢?
首先我们都知道我们面向对象编程最重要的就是对象,那么对象都有自己的内存地址,当我们使用的时候就去创建,然后就新建了一个地址,但是当我们以后不用或者当时用不到的时候,那么有没有及时的销毁或者释放呢?如果没有,那么这个对象就会一直存在内存里边;
另外一个解释,类的引用,我们都知道,在某一个类创建的时候,在很多地方都可以去引用,调用其中的方法,但是当我们这个类关闭也就是销毁之后,在其他类使用这个类的引用对象的时候又会被“激活”。又或者这个内存地址我们“丢了”,也就是我们找不到引用了,那么这个对象又会存在于内存中无法被及时的释放 ;
在举一个情况,我们经常在非UI线程发送handler发送定时任务去处理相关动作,可是关闭activity之后呢?这个handler找不到这个activity的类引用了,也会发生内存泄漏(这种情况一般不会出现,因为没有人这样去做);
再有一种情况,也是我们代码中导致内存溢出的一个大的原因,图片的内存泄漏,我们都知道渲染图片是一个bitmap对象,那么系统在创建的时候自然会给出内存大小去加载这个图片,当这个bitmap太大的时候,内存不够去渲染去创建;又或者一次使用之后没有调用bitmap的recycle()销毁对象方法,那么多次渲染后也会发生内存泄漏的错误 。
再来一个,Cursor指针对象对于用过安卓内部数据库的人不算陌生吧,我们这个对象在用过之后或者长时间不用的时候一定记得要去释放 ,最早的时候发生内存泄漏也就是他了。等等还有很多情况会导致内存泄漏,但是大部分原因都是因为引用没有得到及时的释放出现的问题。以下还有这几种情况:
1.使用Adapter时,没有使用系统缓存的converView
2.没有即时调用recycle()释放不再使用的bitmap
3.使用application的context来替代activity相关的context不要让生命周期长于Activity的对象持有到Activity的引用
4.广播注册没取消造成内存泄露
5.Handler应该申明为静态对象, 并在其内部类中保存一个对外部类的弱引用。
现在就来说一下内存溢出吧,1,创建对象的时候申请的内存少,不够存下将要存入的对象或者数据,这样就会导致内存溢出 2,内存泄漏严重,长期不释放内存地址,会导致内存溢出 。
有不同见解或者有分歧的欢迎留言