我有一个看起来像这样的类结构。
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的引用。
有人可以解释一下吗?
答案 0 :(得分:1)
在Java中,非静态内部和匿名类具有隐式 引用他们的外类。静态内部类,另一方面 手,不要。
因此,例如,如果您在B类或C类上执行长时间运行操作,则会阻止活动上下文被垃圾回收并泄漏所有 应用程序的资源。
另一个可能的原因可能是您没有正确处理后台线程,并且这些线程仍在执行或已安排在将来执行。正如Alex Lockwood撰写的this post:
不要以为Java会为你清理正在运行的线程。
最后,您可以集成leakcanary,这是一个很好的内存泄漏检测工具。它将向您显示哪个对象包含引用并防止垃圾回收。