我在一次采访中遇到这样一个问题:在方法内部创建的对象是否有资格在方法完成后进行垃圾回收?是正确答案吗?
taor4pac1#
好吧,这取决于-它有资格垃圾收集,只要没有更多的“活”的引用它。如果您在方法中做了一些事情,这意味着在方法完成之后仍然有活动引用,那么no-对象将没有资格进行垃圾收集。例如:
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() 已经完成-毕竟,我们希望在下一行代码中获取它!
foo()
pxyaymoc2#
我想补充的唯一一点是,只要在一个不合格的对象中有一个对它的强引用,那么一个对象就没有资格进行垃圾收集。有一些弱引用(以及其他一些类型的引用)使得它们指向的对象可以收集,即使引用本身仍然存在。您可以查看weakhashmap和相关的更多信息。
b4qexyjb3#
当一个对象没有引用时,它可以被垃圾收集,或者引用它的每个对象也被垃圾收集。
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; }
不可能在这里,因为它正在被归还。如果呼叫者抓住了它,它就活了。如果有人有一个指向它的指针,它将保持活动(大致)。
fcg9iug34#
假设当方法退出时,对该对象的引用没有被传递给仍在作用域中的其他对象,那么是的。
4条答案
按热度按时间taor4pac1#
好吧,这取决于-它有资格垃圾收集,只要没有更多的“活”的引用它。如果您在方法中做了一些事情,这意味着在方法完成之后仍然有活动引用,那么no-对象将没有资格进行垃圾收集。例如:
在中创建的对象
foo()
当然不符合垃圾收集的条件foo()
已经完成-毕竟,我们希望在下一行代码中获取它!pxyaymoc2#
我想补充的唯一一点是,只要在一个不合格的对象中有一个对它的强引用,那么一个对象就没有资格进行垃圾收集。
有一些弱引用(以及其他一些类型的引用)使得它们指向的对象可以收集,即使引用本身仍然存在。您可以查看weakhashmap和相关的更多信息。
b4qexyjb3#
当一个对象没有引用时,它可以被垃圾收集,或者引用它的每个对象也被垃圾收集。
在这里,o可以在方法之后被垃圾收集,因为没有任何东西指向它。
在这里它不能,因为其他东西仍然可以引用o,因为它是一个类成员。
不可能在这里,因为它正在被归还。如果呼叫者抓住了它,它就活了。
如果有人有一个指向它的指针,它将保持活动(大致)。
fcg9iug34#
假设当方法退出时,对该对象的引用没有被传递给仍在作用域中的其他对象,那么是的。