方法和垃圾收集

问题描述:

我在接受采访时遇到这样一个问题:方法和垃圾收集

里面创建一个方法 符合垃圾收集 的对象的方法完成后?

是的正确答案?

+2

答案取决于比你的问题中陈述的更多的东西。面试官可能正在等待你询问相关问题 - 他们想知道你对垃圾收集有多少了解,这可以根据你问他们的回答来确定。 – 2009-11-02 21:23:53

+0

是的,只要它没有被“根路径”引用,即它没有被另一个不可终结的对象引用。 – rsp 2009-11-02 21:38:06

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

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()已经完成 - 毕竟,我们希望它的下一行代码获取!

假设对该对象的引用没有交给其他方法,当方法退出时仍然在范围内,那么是的。

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

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

这里,Ø可以是方法后收集垃圾,因为没有指向它。

Object o = null; 

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

这不能,因为其他的事情还是可以参考Ø因为它是一个类成员。

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

这里不能,因为它被返回。如果呼叫者坚持,它仍然活着。

如果有人有指向它的指针,它会保持活动状态(大致)。

我想添加到上面的答案唯一的事情是,只要有一个从一个不符合条件的对象内引用它,对象不符合垃圾回收的条件。

有一些弱引用(和其他一些类型的东西)使对象指向可收集对象,即使引用本身仍然存在。你可以看到WeakHashMap和相关的更多信息。