java - j2ee应用程序中涉及循环引用和数组的内存泄漏

标签 java memory-leaks garbage-collection

我读到,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/

相关文章:

java - 按键终止 Java 线程

c++ - 将一个数组的内容复制到另一个数组会导致内存泄漏吗

Java:GarbageCollectorMBean.getCollectionTime 是否返回暂停时间或其他内容?

memory - 戈朗。零垃圾传播或有效使用内存

java - PDF 抓取 -> MS Access

java - 在 Android Studio 中创建按钮动画

swift - 内存泄漏与方法 NSRegularExpression.matchesInString()

java - Spring Integration 一直消耗更多内存

.net - 如何在 Windows 7 中打开 GCStress?

Java 作业帮助(与 MVC 作斗争)