允许死内存的Java垃圾收集?

标签 java garbage-collection

<分区>

我想知道这个示例代码会发生什么:

public class Start {
    public static void main(String[] args) {
        new Start().go();
    }

    public Start() {
        A a = new A();
        B b = new B();
        a.setB(b);
        b.setA(a);
    }

    public boolean running = true;

    public void go() {
        while( running ) {
             try {
                 Thread.sleep(10);
             } catch ( Throwable t ) {}
        }
    }
}

public class A {
    B b;
    public void setB(B b) {
        this.b = b;
    }
}

public class B {
    A a;
    public void setA(A a) {
        this.a = a;
    }
}

这显然是一个愚蠢的程序,但是: 我在想 A 和 B 的实例会发生什么? 它们都被彼此引用,因此不应将它们视为可 Collection 的。 但事实上,它们对程序的其余部分来说是死的,因为它们将永远不会被再次引用。

所以我的问题是它们会被垃圾收集吗?或者它们是死的内存?

提前致谢!

最佳答案

一旦 Start 的构造函数结束,两个引用 ab 将无法被任何“根”访问,因此它们符合条件到垃圾收集。根通常是调用堆栈上的变量或全局变量。

一些垃圾收集器(例如那些使用 reference counting 的垃圾收集器)在处理循环引用时可能会遇到困难,但现代 GC 可以毫无问题地处理这种情况。

关于允许死内存的Java垃圾收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18980271/

相关文章:

java - OSGI:如何找出哪些 bundle 订阅了我的服务引用字典中定义的特定属性?

java - 在hadoop中查找不同列的最有效方法是什么

java - Java 中的内存分配 - Android

java - 我如何将java对象从服务器端传递到客户端

java - 在Java中创建之前检查kafka中是否存在主题

java - mvn 发布 :prepare in spring boot 时无法将文件提交到 github

c# - 在循环图中使用 ThreadLocal<T> 时发生内存泄漏

javascript - jQuery:新的临时 DOM 元素的内存管理

java - 元空间和垃圾收集

java - Hadoop上下文中Java的内存问题