Android 内存泄漏注意点

何为内存泄漏?

所谓内存泄漏就是无用的对象得不到释放,依然占用内存空间。

在android中都有哪些情况会出现这种情况呢?

1.某个生命周期长的对象,引用一个生命周期短的对象,生命周期短的已经结束,但是被生命周期长的引用而无法得到释放。包括以下这些情景:

1)我们写的单例引用到activity,activity通过返回进行了destroy,但是由于单例的引用造成内存泄漏。解决方式,使用相同生命周期的对象作为引用。

2)非静态内部类Handler,Handler发送消息后,就会被消息所引用,而handler作为非静态内部类会持有Activity的引用,造成Activity无法释放。解决方法,静态内部类+弱引用。

3)Activity静态变量持有Activity的引用(类似1)),因为静态变量的生命周期要比Activity的生命周期长,所以会长期持有Activity的引用。解决方法,在使用结束后置为null。

4)Thread,AsycTask这两个内部类,因为异步的处理一些事情,生命周期可能会比Activity生命周期要长,最好采用静态内部类+弱引用来处理。

5)Timer, TimerTask这里也会异步的处理一些事情,造成Activity的被引用无法释放。解决方案,在退出Activity的时候cancel掉task。

6)广播及observer在退出activity的时候记得要及时的注销,否则会一直引用Activity。

2. 集合中的对象在使用完后,如果没有机会再使用到它,记得要从集合中remove掉它。

3.IO,Fi le,网络连接,sqlite,cusor使用完后要记得关闭,否则存在buffer中的资源得不到释放。

4. 属性动画,在使用完后记得要调用cancel,否则会一直存在并引用对应的控件,而控件又会引用Activity。

5. Webview使用完,要记得从父view中remove掉,用停用其与Activity的相关联。我们添加Activity后,就会注册相应的callback,而callback会引用到Activity,Android 5.1中注销这部分之前会判断有没有调用webView.destroy(),如果调用过就不会走注销,就会一直引用Activity,这里需要自己手动的将webView从Activity中移除,并解除相关联,并destroy掉它。

在这里我们可以使用StrictMode来检测是否存在内存泄漏,也可以通过分息hprof来确定有没有内存泄漏。

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

推荐阅读更多精彩内容

  • Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏...
    _痞子阅读 1,657评论 0 8
  • 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏大家都不陌生了,简单粗俗的讲,...
    宇宙只有巴掌大阅读 2,417评论 0 12
  • 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏大家都不陌生了,简单粗俗的讲,...
    DreamFish阅读 803评论 0 5
  • Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏...
    apkcore阅读 1,240评论 2 7
  • 如果让你现在打开手机照片这一栏,立马删照片,只留下十张,你能做到吗?你能毫不犹豫吗? 现在这个张手...
    Mrs简阅读 270评论 0 0