首先看一段内存泄露的代码:
```public class LeakActivity extends AppCompatActivity {
private static Leak mLeak;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_leak);
mLeak = new Leak();
}
private class Leak{
// do something ...
}
}
运行LeakActivity后,旋转屏幕几次后,通过MAT看见里面有几个LeakActivity和LeakActivity$Leak,说明有内存泄漏现象。
翻看一些博客后,解释是:非静态内部类会默认持有外部类的引用(通过MAT确实看见LeakActivity$Leak内部有个this$0,这个对象就是LeakActivity),当LeakActivity销毁重建后由于其内部类Leak持有了它的引用,并且Leak是静态的,生命周期和应用一样长,因此导致LeakActivity无法被销毁,因此一直存在于内存中。
我的疑惑就在于,在onCreate方法中,mLeak = new Leak(),这一句mLeak引用指向了新的地址,那么在前面创建的Leak对象由于没有被引用了应该会被GC给回收掉,同时LeakActivity也会被回收掉而只剩下一个才对呀。为什么内存中还是会有多个Leak对象呢?我的Java基础不是很好,有人可以帮忙解释一下吗?感谢哦~
这就是先有鸡还是先有蛋的问题,要销毁LeakActivity,必须先销毁mLeak,但是要销毁mLeak,必须先销毁LeakActivity,所以一个也不能销毁。
主要是要理解mLeak是静态的,当你mLeak = new Leak(),这里会减少一个引用计数,当想销毁释放的时候,因为它内部有activity对象,而activity对象又有一个静态leak,这样销毁activity的时候又要先销毁leak。这样就形成了循环引用。导致不能释放
不知道楼主解决了吗,我测试了,应该只有一个LeakActivity泄露了,就是最后一个LeakActivity。之前的LeakActivity就像你说的没有根引用到它,就被GC回收了,如果你看到可以私信回复下。