当前位置: 移动互联网学院 > Android开发 > 常见Android内存泄漏类型
常见Android内存泄漏类型 时间:2017-04-25     来源:Android开发学习网

一个不会被使用的对象,因为另一个正在使用的对象持有该对象的引用,导致它不能正常被回收,而停留在堆内存中,内存泄漏就产生了。那么常见Android内存泄漏类型有哪些呢?

常见Android内存泄漏类型
常见Android内存泄漏类型

1.单例模式造成的内存泄漏:

在activity生命周期中使用单例模式的时候 ,当Activity A生命周期结束,但静态类里面却还存在activity的引用(mContext),这样Activity就会占用的内存就一直不能回收,而静态类的对象也不会再被使用,从而导致内存泄漏;

2.集合造成的内存泄漏:

集合类如果仅仅有添加元素的方法,而没有相应的删除机制,导致内存被占用。如果这个集合类是全局性的变量 (比如类中的静态属性,全局性的 map 等即有静态引用或 final 一直指向它),那么没有相应的删除机制,很可能导致集合所占用的内存只增不减。比如我们都喜欢通过 HashMap 做一些缓存之类的事,这种情况就很容易导致泄漏问题。

3.匿名内部类/非静态内部类导致内存泄漏:

匿名内部类/非静态内部类和异步线程,默认都会持有外界的引用,如果前者突然因为某种原因要finish,或者activity突然挂掉 , 但是系统判断还有对象持有,那么就会造成内存泄漏。

4.线程造成的内存泄漏:

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

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

对于使用了BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap等资源的代码,应该在Activity销毁时及时关闭或者注销,否则这些资源将不会被回收,造成内存泄漏。

6.handler泄漏:

对于handler泄漏其实是由于消息队列持有对handler的引用,而handler又持有activity的隐式引用,这个引用会保持到消息得到处理,而导致activity无法被垃圾回收器进行回收,而导致内存泄漏 ,使用static+WeakReference可以解决内存泄漏问题,不过不写也无所谓 , 不加static的默认会在handler构造函数加上activity这个参数,只要handler没有被回收,就会泄露。加static目的是为了防止泄露,为什么会泄露,就是因为没回收,没回收是因为还引用着。只有postDelayed的时候才会有泄露问题,因为delayed的时候activity的引用还保持着,所以只要delayed完了就能回收了,大多数情况下根本不必用加static。

以上为大家介绍了6中常见的Android内存泄漏类型,知道了Android中内存泄漏大概有哪些类型,再结合使用一些Android studio内存泄漏分析工具,就能快速定位内存泄漏的具体原因。