vicwudi 2017-03-10 16:31 采纳率: 0%
浏览 1926
已结题

Android中非静态内部类造成的内存泄漏问题,有一点想不明白的地方,求解!

首先看一段内存泄露的代码:

```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基础不是很好,有人可以帮忙解释一下吗?感谢哦~
  • 写回答

3条回答

  • threenewbee 2017-03-10 23:04
    关注

    这就是先有鸡还是先有蛋的问题,要销毁LeakActivity,必须先销毁mLeak,但是要销毁mLeak,必须先销毁LeakActivity,所以一个也不能销毁。

    评论

报告相同问题?

悬赏问题

  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP