Java垃圾收集器类A - > B类 - > C类> B类和循环参考

时间:2014-08-13 11:35:40

标签: java garbage-collection

我有一个与Java中的垃圾收集有关的问题

让我们想一想情况

有三个类 A类,B类,C类

  • 现在 A有B
  • B有C

现在说A = null; (我将空指定给A)

A是否有资格获得垃圾收集?

如果是,那么C会发生什么?

2 个答案:

答案 0 :(得分:4)

简短的回答是肯定的。

垃圾收集器搜索对象图,并且可以识别对象子树何时断开连接并扫描整个子树;无论子树中是否存在循环这一事实。

如果收集了C类的实例; GC将执行终结器然后销毁对象。

答案 1 :(得分:0)

这不是关于哪个对象。 GC将只扫描所有对象并检查它是否可以。仅当GC确定对象无法访问时,才会执行finalize()方法。

public class TryThreads {
B b = new B();

@Override
protected void finalize() throws Throwable {
    System.out.println("TryThreads finalizing..");
}

public static void main(String[] args) {
    TryThreads t = new TryThreads();
    t = null;
    System.gc();
    System.runFinalization();

}

}

class B {
String s = new String("hello");

@Override
protected void finalize() throws Throwable {
    System.out.println("B finalizing");
}

}

O / P:

B finalizing
TryThreads finalizing..

现在,如果b实例的TryThread有强引用。

public class TryThreads {     B b = new B();

@Override
protected void finalize() throws Throwable {
    System.out.println("TryThreads finalizing..");
}

public static void main(String[] args) {
    TryThreads t = new TryThreads();
    B b = t.b; // keeping a reference of b within t. only t will be collected, not b.
    t = null;
    System.gc();
    System.runFinalization();

}

}

class B {
String s = new String("hello");

@Override
protected void finalize() throws Throwable {
    System.out.println("B finalizing");
}

}

O / P:

TryThreads finalizing..