【发布时间】:2013-03-19 06:13:15
【问题描述】:
我知道System.gc()不保证会引起GC,但是理论上,在下面的代码中,对象obj是否有资格进行垃圾回收?
public class Demo {
public static void main(String[] args) throws Exception {
SomeClass obj = new SomeClass();
ArrayList list = new ArrayList();
list.add(obj);
obj = null;
System.gc();
}
}
class SomeClass {
protected void finalize() {
System.out.println("Called");
}
}
【问题讨论】:
-
也不能保证
finalize会被调用 -
不符合条件,因为您的 obj 引用为空,但在仍然可以访问的存在的列表中。
-
虽然答案是“否”(假设变量总是强根),但这是一个有趣的观点。在 .NET/C# 中,SomeClass 对象可能被垃圾回收,因为
list本身没有被使用 [稍后]。这是一个实际的 .NET 问题,在长时间运行的方法中存在计时器回调。问题是:在Java中,可见堆栈上的每个变量总是保证是强根吗?