Утечки памяти Java с классами

1

Я задаюсь вопросом, является ли следующий фрагмент кода утечкой памяти, поскольку 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;
}
Теги:
memory-leaks

1 ответ

6
Лучший ответ

Будут ли все 100 выделенных Птиц позаботиться о дереве с помощью сборщика мусора?

Ну, ваш код на самом деле не создает никаких экземпляров Bird. Он просто создает массив, и каждый элемент этого массива будет null.

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

Вероятно, вам не нужен ваш myTree = null; либо... если это локальная переменная, выходящая из области видимости, или переменная экземпляра в объекте, которая в любом случае станет подходящей для сбора мусора, тогда это бессмысленно.

Для относительно новых программистов Java может потребоваться некоторое время, чтобы научиться доверять сборщику мусора и отпустить контроль... но как только вы это сделаете, ваш код будет намного проще :)

  • 0
    Да, иногда трудно доверять сборщику мусора, когда вы выходите из C ++. Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню