我读到,Java 垃圾收集器足够智能,可以处理循环引用(A->B 和 B->A。或者 A->B、B->C 和 C->A)。然而,我们的三个类遇到了内存泄漏问题,我想知道它们之间的相互关系是否与此有关。 这是它们的简化版本:
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 应用程序来说不是问题,因为所有对象都绑定(bind)到执行的主线程 (public static void main(String [] args))。但是,我们的程序位于应用程序服务器(IBM Websphere)内,因此没有 main 方法。
我们确定存在内存泄漏,并且涉及这三个类(基于堆内存分析的结果),我想知道是否有可能将这些组合起来条件导致泄漏。
注意:值得注意的是,这些关系是单向的。例如,C 的实例持有对 B 列表的引用,但这些 B 并未指向 C,并且它们所指向的 As 也没有指向 B 的引用。
最佳答案
不,循环引用不会在 Java 中引起问题。 只要该对象无法从任何 GC 根(线程、局部变量、静态变量、JNI 引用)访问,该对象就对 GC 有效。这就是您需要跟踪的内容,GC 根并查看它们是否永远保留引用。
您可以使用分析器来实现此目的。
关于java - j2ee应用程序中涉及循环引用和数组的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35420202/