一、简单理解
(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的生命周期较长,引用情况下不会造成内存泄露问题。
内存溢出和内存泄露
最新推荐文章于 2024-07-31 16:57:19 发布