做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[]必须配对使用

更多相关文章

  1. android dalvik虚拟机内存分配问题
  2. Android(安卓)性能优化(62)---存检测、卡顿优化、耗电优化、APK
  3. Android中一个Activty控制另一个Activity的函数及变量
  4. Android开发技术周报 Issue#47
  5. Android架构纵横谈之——软件自愈能力 (2)
  6. Android内存监测工具DDMS->Heap,内存分析工具->MAT
  7. Android第一行代码踩坑qwq
  8. OOM原因和解决方案
  9. StevGuo系列文章翻译之Android系统属性

随机推荐

  1. 如何在xml中设置textview不可见
  2. 【Android浏览器插件开发准备工作之NPAPI
  3. Android SDCard 分隔符路径
  4. Android自定义Toast
  5. [工作积累] Android: Hide Navigation ba
  6. Android实现简易版打地鼠
  7. Android RadioButton【单选按钮】的点击
  8. android studio实现发短信
  9. Android(安卓)MVP设计模式的最佳实现
  10. [经典]Android开源项目分类汇总和Android