android下的内存泄漏

做android都了解的,刚好有同事问,就整理了下。

内存泄露

内存泄漏,在C/C++里面指的是用malloc/new分配了内存,然后没有进行free/delete,导致分配的内存无法回收。

Java有垃圾回收,所以Java内存泄漏一般都是指的某些无用对象因为被引用导致的无法垃圾回收,占用了不必要的内存。

可以参看QQ空间团队这张图


内存泄漏示意图

Android中的内存泄漏

常见的几种内存泄漏的情况

  1. static变量引用Activity的Context
    写应用的时候有时候会用到单例,一般单例用static变量保存,生命周期是整个应用程序,而访问系统资源又需要Context,单例常常会需要保存Context
    如果传入Activity的Context会导致Activity间接的被static变量持有,无法回收导致内存泄漏。
    能用Application Context代替的,尽量用Application Context。
  2. 匿名内部类
    匿名的内部类会持有外部类的引用,导致外部类不能被回收。
    比如,在Activity里面启线程,然后线程访问了Activity的一些成员变量,如果这个线程是长时间运行的(尤其是后台运行的),会导致这个Activity不被回收。类似的还有用Handler去post Runnable。
    Activity onStop/onDestroy的时候,能取消的延迟任务记得取消
  3. 注册的回调/监听函数
    其实和匿名内部类差不多的原理,很多时候会注册一个回调函数到底层的Service,比如在做蓝牙扫描的时候,会注册监听,接收结果刷新Activity。或者其他类似的异步操作。这些内部的非静态的回调对象都会持有Activity的引用,导致Activity无法回收。
    Activity onStop/onDestroy的时候,取消注册/监听函数

参考文章
Android内存泄漏分析心得
建议28:new/delete与new[]/delete[]必须配对使用

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

推荐阅读更多精彩内容

  • 被文同时发布在CSDN上,欢迎查看。 APP内存的使用,是评价一款应用性能高低的一个重要指标。虽然现在智能手机的内...
    大圣代阅读 4,848评论 2 54
  • Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏...
    _痞子阅读 1,652评论 0 8
  • 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏大家都不陌生了,简单粗俗的讲,...
    宇宙只有巴掌大阅读 2,399评论 0 12
  • Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏...
    apkcore阅读 1,237评论 2 7
  • 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏大家都不陌生了,简单粗俗的讲,...
    DreamFish阅读 802评论 0 5