调用new Object();两次使第一次调用创建的对象有资格进行垃圾回收?

时间:2015-01-10 15:40:16

标签: java garbage-collection

假设:

    1. public class GC {
    2.    private Object o;
    3.    private void doSomethingElse(Object obj) { o = obj; }
    4.    public void doSomething() {
    5.       Object o = new Object();
    6.       doSomethingElse(o);
    7.       o = new Object();
    8.       doSomethingElse(null);
    9.       o = null;
    10.   }
    11. }

当调用doSomething()方法时,在第5行创建的Object可用于垃圾收集之后是哪一行?

正确答案是第8行。

为什么?我认为它应该是第7行,因为new会发起新的Object,然后分配到o,这会导致第5行中创建的Object丢失其引用(然后才有资格获得GC )。我错了吗?

1 个答案:

答案 0 :(得分:4)

  

正确的答案是第8行。为什么会这样?

您将o本地doSomething()o类别混淆,令您感到困惑。尽管第7行将o的doSomething()版本设置为其他引用,但您仍然拥有通过o方法设置的类级doSomethingElse()。您必须将该引用置空以使其符合GC条件,并且只能通过第8行的方法调用进行。