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 应用程序中的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章