Я задаюсь вопросом, является ли следующий фрагмент кода утечкой памяти, поскольку Google только вызывает странные примеры. В принципе, если у меня есть Tree
классов:
public class Tree{
private Bird[] birds;
public Tree(){
birds = new Bird[100];
}
}
и я держу ссылку на Tree
таким образом:
Tree myTree = new Tree();
а затем вскоре после этого я установил ссылку на null
:
myTree = null;
Будут ли все 100 выделенных Птиц позаботиться о дереве с помощью сборщика мусора? Или мне нужен метод delete()
? Я знаю, что Java не имеет деструкторов, но этот пример многоуровневого класса меня смущает:
внутри Tree.java
:
public void deleteBirds{
birds = null;
}
Будут ли все 100 выделенных Птиц позаботиться о дереве с помощью сборщика мусора?
Ну, ваш код на самом деле не создает никаких экземпляров Bird
. Он просто создает массив, и каждый элемент этого массива будет null
.
Тем не менее, основной ответ - "да" - если вы ничего не ссылаетесь на массив, и больше ничего не ссылается ни на один из объектов Bird
который вы могли бы создать в другом месте, тогда сборщик мусора позаботится о них. Вы почти наверняка не должны писать какой-либо метод "удалить".
Вероятно, вам не нужен ваш myTree = null;
либо... если это локальная переменная, выходящая из области видимости, или переменная экземпляра в объекте, которая в любом случае станет подходящей для сбора мусора, тогда это бессмысленно.
Для относительно новых программистов Java может потребоваться некоторое время, чтобы научиться доверять сборщику мусора и отпустить контроль... но как только вы это сделаете, ваш код будет намного проще :)