我有一个与Java中的垃圾收集有关的问题
让我们想一想情况
有三个类 A类,B类,C类
现在说A = null; (我将空指定给A)
A是否有资格获得垃圾收集?
如果是,那么C会发生什么?
答案 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..