Android应用程序中的内存泄漏

时间:2016-07-04 09:36:12

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

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

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

有人可以解释一下吗?

1 个答案:

答案 0 :(得分: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,这是一个很好的内存泄漏检测工具。它将向您显示哪个对象包含引用并防止垃圾回收。