【问题标题】:Memory Leak in Android applicationAndroid 应用程序中的内存泄漏
【发布时间】:2016-07-04 09:36:12
【问题描述】:

我有一个看起来像这样的类结构。

class A
    {
        B b;

        A()
        {
            b = new B();
            b.a = this;
        }
    }

    class B
    {
        A a;
    }

    class C
    {
        A a = new A();

        //a is ready for Garbage collection
        a = null;
    }

在活动 Destroy() 中,我将设置变量 a = null。但在堆上,我仍然可以看到变量 b 包含 B 的引用。

谁能解释一下?

【问题讨论】:

  • 也许只是还没有收集到。尝试强制 gc?
  • @Memme 强制 gc 是个坏主意!你需要阻止内存泄漏而不是试图掩盖它。
  • @apmartin1991 当然。但我会检查它只是为了确定。无论如何,您在 C 中实例化一个新对象并将其设置为 null 的事实将仅收集该特定实例。但我可能错了:)

标签: android memory-leaks memory-leak-detector


【解决方案1】:

在 Java 中,非静态内部类和匿名类包含一个隐式 引用他们的外部类。另一方面,静态内部类 手,不要。

因此,例如,如果您在 B 或 C 类上执行长时间运行的操作,这将防止活动上下文被垃圾收集并泄漏所有 应用程序的资源。

Here is a great post about memory leaking on Android with static inner classes, written by Alex Lockwood

另一个潜在的原因可能是您没有正确处理后台线程,这些线程仍在执行或已安排为将来执行。正如 Alex Lockwood 在this post 上所写:

不要假设 Java 会为您清理正在运行的线程。

最后,您可以集成leakcanary,这是一个很好的内存泄漏检测工具。它会通过图表向您展示哪些对象拥有引用并防止垃圾收集。

【讨论】:

  • 是的,但是这段代码中没有内部或嵌套类
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-01
  • 1970-01-01
  • 2016-11-23
  • 2018-12-30
相关资源
最近更新 更多