Влияет ли использование оператора «new» на уже созданном объекте утечки памяти? - PullRequest
0 голосов
/ 26 апреля 2018

Я провел некоторое исследование по этому вопросу, но я так и не нашел ответа.

Например, я знаю, что если бы я написал это в игровом цикле:

public void update () {
    Object object = new Object();
}

Тогда у меня будет утечка памяти.

Но если у вас есть объект класса, для которого вы вызываете new, это не приведет к утечке памяти, верно? Поскольку вы не создаете другой объект, вы просто присваивает текущему объекту новое значение.

Например:

private Object object;

//...

public void update () {
    object = new Object();
}

-Edit

Спасибо за вашу помощь! Теперь я вижу, что в значительной степени понятия не имел, что такое утечка памяти или что ее вызывает ... Но теперь я понимаю больше, чем раньше!

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Ни один из примеров не является утечкой памяти. Нет памяти потеряно. Сборщик мусора вернет память, так как на нее нет ссылок. Оба примера выделяют память, хотя. Каждый раз, когда вы вызываете новый, он выделяет новый объект. Не имеет значения, храните ли вы новый объект где-то или нет. Так что в обоих случаях это было бы плохо в узком цикле, так как он выделил бы память, которая затем должна быть собрана сборщиком мусора.

В качестве примечания, Java довольно умен, поэтому может через некоторое время оптимизировать оба примера, если они находятся в тесном цикле, поскольку вы не используете значения. Чтобы избежать этого (если вы действительно хотите медленный код), сделайте переменную volatile.

0 голосов
/ 26 апреля 2018

Предпосылка вашего вопроса ошибочна.

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

То, о чем вы спрашиваете здесь, - это присвоить их переменной или полю. Само по себе не имеет значения, является ли это переменная или поле с точки зрения утечки памяти. Также не имеет значения, инициализировано ли это поле или переменная: вы просто заменяете ссылку на один объект ссылкой на другой.

Единственное, что могло бы изменить ситуацию, - это если вы также добавите объект в список (или некоторую другую коллекцию, массив и т. Д.) Или добавите объект, содержащий поле, в список и т. Д.: тогда не удастся собрать мусор, так как объект все еще доступен. Тогда у вас будет утечка памяти.

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