做android都了解的,刚好有同事问,就整理了下。
内存泄露
内存泄漏,在C/C++里面指的是用malloc/new分配了内存,然后没有进行free/delete,导致分配的内存无法回收。
Java有垃圾回收,所以Java内存泄漏一般都是指的某些无用对象因为被引用导致的无法垃圾回收,占用了不必要的内存。
可以参看QQ空间团队这张图
Android中的内存泄漏
常见的几种内存泄漏的情况
- static变量引用Activity的Context
写应用的时候有时候会用到单例,一般单例用static变量保存,生命周期是整个应用程序,而访问系统资源又需要Context,单例常常会需要保存Context
如果传入Activity的Context会导致Activity间接的被static变量持有,无法回收导致内存泄漏。
能用Application Context代替的,尽量用Application Context。 - 匿名内部类
匿名的内部类会持有外部类的引用,导致外部类不能被回收。
比如,在Activity里面启线程,然后线程访问了Activity的一些成员变量,如果这个线程是长时间运行的(尤其是后台运行的),会导致这个Activity不被回收。类似的还有用Handler去post Runnable。
Activity onStop/onDestroy的时候,能取消的延迟任务记得取消 - 注册的回调/监听函数
其实和匿名内部类差不多的原理,很多时候会注册一个回调函数到底层的Service,比如在做蓝牙扫描的时候,会注册监听,接收结果刷新Activity。或者其他类似的异步操作。这些内部的非静态的回调对象都会持有Activity的引用,导致Activity无法回收。
Activity onStop/onDestroy的时候,取消注册/监听函数