我在采访中遇到了这个问题:
是在方法内创建的对象 有资格进行垃圾收集 方法完成后?
是的,是正确答案吗?
答案 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相关信息以获取更多信息。