Методы и сборка мусора - PullRequest
       32

Методы и сборка мусора

0 голосов
/ 03 ноября 2009

Я столкнулся с этим вопросом в интервью:

Является ли объект, созданный внутри метода право на сборку мусора после того, как метод закончен?

Да, правильный ответ?

Ответы [ 4 ]

9 голосов
/ 03 ноября 2009

Объект может быть подвергнут сборке мусора, если на него нет ссылок, или каждый объект, который ссылается на него, также подвергается сборке мусора.

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

Здесь этого не может быть, потому что его возвращают. Если звонящий держится за него, он остается живым.

Если на кого-то есть указатель, он остается в живых (примерно).

3 голосов
/ 03 ноября 2009

Что ж, это зависит от того, подходит ли он для сборки мусора, как только на него больше нет «живых» ссылок. Если вы что-то сделали в методе, что означает, что после завершения метода все еще есть живые ссылки, то нет - объект не будет пригоден для сборки мусора. Например:

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() - в конце концов, мы хотим получить его в следующей строке кода!

1 голос
/ 16 марта 2010

Единственное, что я хотел бы добавить к ответам выше, это то, что объект не подходит для сборки мусора, если на него имеется ссылка strong из недопустимого объекта.

Существуют Слабые ссылки (и несколько других видов, в этом отношении), которые делают объекты, на которые они указывают, собираемыми, даже если сама ссылка все еще там. Вы можете увидеть WeakHashMap и связанные с ним для получения дополнительной информации.

1 голос
/ 03 ноября 2009

Если предположить, что ссылка на этот объект не была передана чему-то еще, что все еще находится в области действия при выходе из метода, тогда да.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...