为什么以下对象不符合垃圾回收的条件?

时间:2015-10-31 07:14:20

标签: java garbage-collection

在下面的代码中,我不明白为什么使用引用b2创建的对象不是null ??。  我已将b2 = null传递给go()对象的b1方法(在制作b1 = null之前),因此我制作了class Demo { Short story = 200; Demo go(Demo cb) { cb = null; return cb; } public static void main(String[] args) { demo b1 = new demo(); demo b2 = new demo(); demo b3 = b1.go(b2); b1 = null; // b1 has been collected by gc hence is null System.out.println(b1.hashCode()); // b3 is also null System.out.println(b3.hashCode()); // but how come b2 is not null? System.out.println(b2.hashCode()); } }

element.style.width = "32mm"; for example.

所以请有人解释一下,为什么b2不是垃圾收集,即使它是空的?

4 个答案:

答案 0 :(得分:4)

demo b3 = b1.go(b2);

Demo go(Demo cb){
    cb = null;
    return cb;
}

使用上面的代码,b2cb的第一个将指向同一个对象。然后当您执行cb = null;然后执行cb时,参考将丢失。但b2仍然指向原始对象。

这意味着至少有一个对象(b2)主动持有对分配的内存/对象的引用。它没有资格进行垃圾收集。

将任何对象设置为null引用并不意味着它被垃圾收集器收集。它只是意味着,现在没有对已分配对象的活动引用,因此它有资格进行垃圾回收。

答案 1 :(得分:4)

首先需要知道垃圾收集(GC)与将某些内容设置为null不同。

我在这里做个比喻。变量(b1b2b3等)就像孩子一样。对象(new Demo())就像气球。当你写:

demo b1 = new demo();

您让孩子b1抓住一个新气球。当您将b1设置为null时,您可以让孩子放开他的气球。气球飞走了,但它仍然存在于天空的某个地方。另一方面,GC就像一个能够捕捉这些飞行气球的超高科技机器。孩子放开气球后,GC会在一段时间后注意到它(这个“时间”可能会有所不同)并去收集它并摧毁它。

现在您已经了解了nullity和GC之间的区别,我们可以继续解决您的真正问题。在方法

Demo go(Demo cb){
    cb = null;
    return cb;
}

您正在将cb设置为null并将其返回。返回值为null。但是,cb不是您之前传递的孩子(b2)。您有一个拿着气球的孩子(b2),当您“将孩子作为参数传递”时,您没有经过孩子,您正在邀请另一个孩子抓住同一个气球。在该方法中,cb是另一个孩子。因此,当将cb设置为null时,您让“另一个孩子”放开气球,但原始孩子b2仍然持有它。

请参阅? b2仍然拿着气球!他不是空的!

答案 2 :(得分:2)

因为cb指向b2所做的同一个对象,但cb与b2不是同一个变量。将cb设置为null不会对b2或b2指向的对象执行任何操作。

答案 3 :(得分:1)

这不是垃圾收集的工作原理。垃圾收集器将找到不再具有任何引用的对象,并收集它们。它将收集仍然引用它们的对象,并且它不会将任何变量设置为null。