Android 应用程序中的内存泄漏

Posted

技术标签:

【中文标题】Android 应用程序中的内存泄漏【英文标题】:Memory Leak in Android application 【发布时间】: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 的事实将仅收集该特定实例。但我可能错了:) 【参考方案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,这是一个很好的内存泄漏检测工具。它会通过图表向您展示哪些对象拥有引用并防止垃圾收集。

【讨论】:

是的,但是这段代码中没有内部或嵌套类

以上是关于Android 应用程序中的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

Android中的内存泄漏和内存溢出

Android中的内存泄漏和内存溢出

Android中的内存泄漏和内存溢出

Android内存优化三:内存泄漏检测与监控

Android 应用程序中的内存泄漏

Android 中的内存泄漏和内存溢出