java方法和垃圾收集

xghobddn  于 2021-07-05  发布在  Java
关注(0)|答案(4)|浏览(294)

我在一次采访中遇到这样一个问题:
在方法内部创建的对象是否有资格在方法完成后进行垃圾回收?
是正确答案吗?

taor4pac

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

pxyaymoc

pxyaymoc2#

我想补充的唯一一点是,只要在一个不合格的对象中有一个对它的强引用,那么一个对象就没有资格进行垃圾收集。
有一些弱引用(以及其他一些类型的引用)使得它们指向的对象可以收集,即使引用本身仍然存在。您可以查看weakhashmap和相关的更多信息。

b4qexyjb

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;
}

不可能在这里,因为它正在被归还。如果呼叫者抓住了它,它就活了。
如果有人有一个指向它的指针,它将保持活动(大致)。

fcg9iug3

fcg9iug34#

假设当方法退出时,对该对象的引用没有被传递给仍在作用域中的其他对象,那么是的。

相关问题