时间:2021-05-20
内存溢出(Out Of Memory):Android系统中每一个应用程序可以向系统申请一定的内存,当申请的内存不够用的时候,就产生了内存溢出。
内存泄漏:当某个对象不再被使用,即不再有变量引用它时,该对象占用的内存就会被系统回收。当某个对象不再被使用,但是在其他对象中仍然有变量引用它时,该对象占用的内存就无法被系统回收,从而导致了内存泄漏。
当内存泄漏过多时,可用内存空间会减少,应用程序申请的内存不够用,就会导致内存溢出。
内存溢出原因:
1.内存泄漏过多。
2.内存中加载的数据量超过内存的可用量。
3.集合类(用于存储对象的引用)中有对对象的引用,使用完后未清空。
4.申请的内存不够。
5.死循环或者循环产生过多对象实例,导致大量内存被消耗。
。。。
内存泄漏原因:
1.资源对象没有关闭:
(1)注册广播接收器后没有调用unregisterReceiver()方法注销广播接收器。
(2)打开文件流之后没有调用close()方法关闭文件流。
(3)数据库游标cursor使用完后没有调用close()方法关闭游标。
(4)图片资源Bitmap使用完之后没有调用recycle()方法回收。
。。。
2.生命周期长的对象持有生命周期短的对象的引用,导致生命周期短的对象内存无法被回收:
(1)单例模式或者静态成员变量的生命周期和应用程序的生命周期相等,当需要引用Context时,如果传入的是Activity的Context,Activity需要被销毁时就无法被回收。解决方法是传入Application的Context,因为Application的Context生命周期等于应用程序的生命周期。
(2)非静态内部类(匿名内部类、Handler等)默认持有外部类的引用,如果非静态内部类的对象实例生命周期比外部类生命周期长(比如非静态内部类定义了一个静态的对象实例),外部类注销时就无法被系统回收,从而导致内存泄漏。解决方法是采用静态内部类+弱引用的方式。
总结:内存泄漏产生的原因主要有两种:一种是资源对象在使用完后没有进行关闭操作。另一种是生命周期长的对象引用了生命周期短的对象,导致生命周期短的对象即使不再使用但仍然无法被系统回收。根本原因在于需要被回收的内存资源没有被系统回收。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
内存溢出和内存泄漏的详解及区别内存溢出outofmemory,是指程序在申请内存时,没有足够的内存空间供其使用,出现outofmemory;比如申请了一个int
什么是内存泄漏内存泄漏是指java应用的堆内存使用率持续升高,直至内存溢出。内存泄漏的的原因可能有多种分配给应用程序的内存本身过小。而应用的业务代码,确实需要生
内存溢出(outofmemory):通俗的说就是内存不够用了,比如在一个无限循环中不断创建一个大的对象,很快就会引发内存溢出。内存泄漏(leakofmemory
一、概述在Android内存泄漏终极解决篇(上)中我们介绍了如何检查一个App是否存在内存泄漏的问题,本篇将总结典型的内存泄漏的代码,并给出对应的解决方案。内存
之前小编为大家介绍了一下内存溢出是什么意思。那么有的网友肯定会问导致的内存溢出的原因是什么?出现额内存溢出又如何解决。不急,下面小编就再次为大家分享一下内存溢出