0

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

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 的引用。

谁能解释一下?

4

1 回答 1

1

在 Java 中,非静态内部类和匿名类包含对其外部类的隐式引用。另一方面,静态内部类则不然。

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

这是一篇关于在 Android 上使用静态内部类进行内存泄漏的精彩文章,由 Alex Lockwood 撰写

另一个潜在的原因可能是您没有正确处理后台线程,这些线程仍在执行或已安排为将来执行。正如亚历克斯洛克伍德在这篇文章中所写:

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

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

于 2016-07-04T09:42:16.990 回答