这是唯一符合垃圾收集条件的变量吗?

时间:2015-08-14 04:22:25

标签: java garbage-collection

我对这段代码的垃圾收集资格有疑问。

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才有资格进行垃圾收集,因为它是唯一丢弃了对它的所有引用的对象。我在这儿吗?

谢谢!

3 个答案:

答案 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)

只有一个对象才有资格进行垃圾收集。拿一张纸然后画出来,你就会知道。

enter image description here

答案 2 :(得分:0)

正如我从 OCA Java SE 7

一书中读到的那样
  

如果对象无法收集,则该对象被标记为有资格进行垃圾回收   更长的时间被访问,这可能发生在对象离开时   范围。当对象的引用变量是时,它也可能发生   分配了显式空值或重新初始化。

因此,如果我们应用此定义,答案将是:对象a 。在这里我重复对象而不是参考。我们必须区分对象和引用!