在内存泄露问题排查中最常遇到就是 【非静态内部类默认持有外部类的引用】
文章目录
- 1 字节码分析
- javac Activity.java
- javap -c Activity.class
- 2 静态内部类会持有外部类引用吗?
- 参考文档
// 简化处理相关代码
public class Activity {
private Handler inner = new Handler();
private class Handler {
}
}
1 字节码分析
javac Activity.java
这样在同文件目录下会生成两个.class文件
javap -c Activity.class
关注字节码中的 putfield这一行,这里表示有一个对 Activity 的引用被存在了 Activity$Handler.class 中,也就是说它持有了外部类的对象
我们打开看看: Activity$Handler类果然默认持有了Activity对象的引用
2 静态内部类会持有外部类引用吗?
public class Activity {
private Handler inner = new Handler();
private static class Handler {
}
}
虽然也有putfield操作码但是并没有引用任何对象
参考文档
为啥非静态内部类能持有外部类?
匿名内部类导致内存泄露的面试题
字节码指令详解