我已经读过Java垃圾收集器足够聪明以处理循环引用(A-> B和B-> A.或A-> B,B-> C和C->一个)。但是,我们遇到了涉及三个类的内存泄漏问题,我想知道他们的相互关系是否与它有关。 这是它们的简化版本:
public class A {
List<B> bes;
}
public class B {
A a;
C c;
}
public class C {
List<B> bes;
}
因此,正如您所看到的,此设计不仅创建了一系列关系(A-> B,B-> C,C-> B和B-> A),而且还涉及多个双方中间(B)班级的实例。
我的理解是,这不是标准Java应用程序的问题,因为所有对象都绑定到主执行线程(public static void main(String [] args))。但是,我们的程序存在于应用程序服务器(IBM Websphere)中,因此没有主要方法。
我们肯定知道存在内存泄漏,并且涉及这三个类(基于堆的内存分析结果),我想知道是否有可能这些组合条件导致泄漏。
注意:值得注意的是关系是单向的。例如,C的实例保存对B列表的引用,但那些B不指向C,并且它们指向的As没有返回B的引用。
答案 0 :(得分:1)
不,循环引用不会导致Java出现问题。 只要无法从任何GC根目录(线程,局部变量,静态变量,JNI引用)访问该对象,该对象将对GC有效。这就是你需要追踪的东西,GC根源,看看他们是否永远持有参考资料。
您可以使用分析器。