我对这段代码的垃圾收集资格有疑问。
public static void main(String[] args) {
Object a = new Object();
Object b = new Object();
Object c = new Object();
a = b;
b = c;
c = null;
}
我已经阅读了几个Java垃圾收集的例子,我想我已经掌握了它。所以我想的是,在行c = null;
之后,只有c
才有资格进行垃圾收集,因为它是唯一丢弃了对它的所有引用的对象。我在这儿吗?
谢谢!
答案 0 :(得分:5)
在Java中,变量不符合垃圾回收的条件; 对象是。变量保存对象的引用,但不是对象本身。
让我们看一下您的示例,其中包含一些示例对象ID(JVM用于跟踪它们的内部标识符,通常不可见):
Object a = new Object(); // id=1
Object b = new Object(); // id=2
Object c = new Object(); // id=3
您现在拥有对象1,2和3,每个对象都来自一个变量:a:1, b:2, c:3
。当您在变量之间复制这些引用时,状态如下:
a = b; // a:2, b:2, c:3
b = c; // a:2, b:3, c:3
c = null; // a:2, b:3, c:null
在a = b
之后,您丢失了对象1的所有引用,该对象最初位于a
,因此它立即符合垃圾回收条件。在块结束之前,对象2和3仍然可以访问,其中所有变量都在范围之外。
答案 1 :(得分:3)
答案 2 :(得分:0)
正如我从 OCA Java SE 7
一书中读到的那样如果对象无法收集,则该对象被标记为有资格进行垃圾回收 更长的时间被访问,这可能发生在对象离开时 范围。当对象的引用变量是时,它也可能发生 分配了显式空值或重新初始化。
因此,如果我们应用此定义,答案将是:对象a 。在这里我重复对象而不是参考。我们必须区分对象和引用!