2021-01-27

什么是内存泄漏

1.内存泄漏的原因

2.为什么有内存泄漏

3.内存泄漏都有哪些

1.内存泄漏的原因

android 系统为每个应用分配的内存是有限的,当一个对象已经不需要再使用了,

本该被回收时,而有另外一个正在使用的对象持有它的引用从而导致它不能被回收,

这导致本该被回收的对象不能被回收而停留在堆内存中,这就产生了内存泄漏。

内存泄漏会使我们的应用随着时间不断增加,造成应用OOM错误,使应用崩溃。

2.为什么有内存泄漏

一个不会被使用的对象,因为另一个正在使用的对象持有该对象的引用,导致它不能正常被回收,而停留在堆内存中,内存泄漏就产生了

Android系统为每个应用分配的内存是有限的,内存泄漏会使我们的应用内存随着时间不断的增加,造成应用OOM(Out Of Memory)错误,使应用崩溃.

3.内存泄漏都有哪些

1.集合类泄漏

(集合类如果仅仅有添加元素的方法,而没有相应的删除机制,导致内存被占用。

如果这个集合类是全局性的变量 (比如类中的静态属性,全局性的 map 等即有静态引用或 final 一直指向它),

那么没有相应的删除机制,很可能导致集合所占用的内存只增不减。)

2.单例造成的内存泄漏

由于单例的静态特性使得其生命周期跟应用的生命周期一样长,所以如果使用不恰当的话,很容易造成内存泄漏。

3.匿名内部类/非静态内部类和异步线程0

非静态内部类创建静态实例造成的内存泄漏

4.匿名内部类

android开发经常会继承实现Activity/Fragment/View,此时如果你使用了匿名类,

并被异步线程持有了,那要小心了,如果没有任何措施这样一定会导致泄露

5.Handler 造成的内存泄漏

Handler、Message 和 MessageQueue 都是相互关联在一起的,万一 Handler 发送的 Message 尚未被处理,

则该 Message 及发送它的 Handler 对象将被线程 MessageQueue 一直持有。

Handler 属于 TLS(Thread Local Storage) 变量, 生命周期和 Activity 是不一致的。

因此这种实现方式一般很难保证跟 View 或者 Activity 的生命周期保持一致,故很容易导致无法正确释放

6.尽量避免使用 static 成员变量

如果你的app进程设计上是长驻内存的,那即使app切到后台,这部分内存也不会被释放。按照现在手机app内存管理机制,

占内存较大的后台进程将优先回收,yi'wei如果此app做过进程互保保活,那会造成app在后台频繁重启。

当手机安装了你参与开发的app以后一夜时间手机被消耗空了电量、流量,你的app不得不被用户卸载或者静默。

7.避免 override finalize()

8.资源未关闭造成的内存泄漏

对于使用了BraodcastReceiver,ContentObserver,File,游标 Cursor,Stream,Bitmap等资源的使用,

应该在Activity销毁时及时关闭或者注销,否则这些资源将不会被回收,造成内存泄漏。

9.一些不良代码造成的内存泄漏

10.线程造成的内存泄漏

当我们在使用线程的时候,一般都使用匿名内部类,而匿名内部类会对外部类持有默认的引用,当Acticity关闭之后如果现成中的任务还没有执行完毕,就会导致Activity不能正常回收,造成内存泄漏

11.监听器没有注销造成的内存泄漏

在Android程序里面存在很多需要register与unregister的监听器,我们需要确保及时unregister监听器。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容