方法和垃圾收集

时间:2009-11-02 21:19:17

标签: java garbage-collection

我在采访中遇到了这个问题:

  

是在方法内创建的对象   有资格进行垃圾收集   方法完成后?

是的,是正确答案吗?

4 个答案:

答案 0 :(得分:9)

当没有对象的引用时,可以对对象进行垃圾回收,或者引用它的每个对象也被垃圾回收。

public int getThing() {
     Object o = new Object();
     return 5;
}

此处, o 可以在方法后进行垃圾回收,因为没有任何指向它。

Object o = null;

public int getThing() {
     o = new Object();
     return 5;
}

这里不能,因为其他东西仍然可以引用 o ,因为它是一个类成员。

public Object getThing() {
     Object o = new Object();
     return o;
}

这里不可能,因为它正在被退回。如果来电者坚持下去,它就会保持活力。

如果有人指向它,它会保持活着(大致)。

答案 1 :(得分:3)

这取决于它 - 只要没有更多的“实时”引用它就有资格进行垃圾收集。如果你在方法中做了一些事情,这意味着在方法完成后仍然有实时引用,那么没有 - 该对象将不符合垃圾收集的条件。例如:

public class Test
{
    private Object field;

    public void foo()
    {
        field = new Object();
    }

    public Object getField()
    {
        return field:
    }
}

// Elsewhere
Test t = new Test();
t.foo();
Object x = t.getField();

foo()完成后,foo()中创建的对象肯定有资格进行垃圾回收 - 毕竟,我们想在下一行代码中获取它!

答案 2 :(得分:1)

假设当该方法退出时,对该对象的引用未被移交给仍在范围内的其他内容,则为是。

答案 3 :(得分:1)

我想在上面的答案中添加的唯一内容是,只要在不符合条件的对象中有一个引用,对象就不符合垃圾回收的条件。

有弱引用(以及其他一些类型的东西)使得它们指向可收集的对象,即使引用本身仍然存在。您可以查看WeakHashMap相关信息以获取更多信息。