【问题标题】:Java garbage collection allowing dead memory? [duplicate]Java垃圾收集允许死内存? [复制]
【发布时间】:2013-09-29 14:09:50
【问题描述】:

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

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的实例会发生什么? 它们都是相互引用的,因此不应被视为可收藏的。 但事实上,它们对程序的其余部分来说已经死了,因为它们永远不会被再次引用。

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

提前致谢!

【问题讨论】:

  • Start 构造函数完成时,ab 都超出了范围。

标签: java garbage-collection


【解决方案1】:

一旦Start 的构造函数结束,任何“根”都无法访问ab 这两个引用,因此它们有资格进行垃圾回收。根通常是调用堆栈上的变量或全局变量。

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

【讨论】:

  • @Oak 我已经澄清了。
【解决方案2】:

它们被垃圾收集器收集,因为它们不再可访问。

In java when does an object become unreachable?

【讨论】:

    猜你喜欢
    • 2012-06-12
    • 2012-06-28
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多