这一系列文章致力于为 Android 开发者查漏补缺,面试准备。
所有文章首发于公众号「JaqenAndroid」,长期持续更新。
由于笔者水平有限,总结的答案难免会出现错误,欢迎留言指出,大家一起学习、交流、进步。
什么是内存泄漏?
Java 中采用可达性分析算法判断一个对象是否可被回收。
基本思路是这样的:
通过一系列称为 “GC Roots” 的对象作为起始点,从这个节点向下搜索,搜索走过的路径就是引用链,当一个对象到 GC Roots 没有任何引用链相连,也就是从 GC Roots 到这个对象不可达,则这个对象不可达,可以被回收。
可作为 GC Roots 的对象有:
- 虚拟机栈中的引用的对象
- 方法区的静态变量和常量引用的对象
- 本地方法栈中 JNI 引用的对象
当一个对象不需要在再使用了,本该被回收时, 而另外一个正在使用的对象持有它的引用从而导致它不能被回收,这就导致本该被回收的对象不能被回收而停留在堆内存中,内存泄漏就产生了。
Handler 是如何造成内存泄漏的?
public class MainActivity extends AppCompatActivity {
private Handler mHandler = new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
// 处理数据
}