Есть ли какое-либо преимущество в присвоении нулю ссылки, когда она больше не используется? - PullRequest
3 голосов
/ 09 января 2012

Я слышал, что назначение ссылки на null в явном виде поможет gc собрать ее.

Это правда?

Если объект находится вне области видимости, он быстро получит gc?

Ответы [ 5 ]

6 голосов
/ 09 января 2012

если объект находится вне области видимости, он быстро получит gc?

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

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

3 голосов
/ 09 января 2012

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

2 голосов
/ 09 января 2012

Если у вас есть массив или ссылка, которые вы намереваетесь сохранить, он может стоить null извлечения.

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

0 голосов
/ 09 января 2012

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

  1. Закрытие ресурса, связанного с объектом, срок жизни которого больше, чем у этого ресурса. Например: реализация java.sql.Connection обычно имеет ассоциированное физическое соединение (например, Socket): когда java.sql.Connection закрыто, вы можете обнулить это физическое соединение, поскольку вы его больше не используете, в то время как фактическое java. sql.Connection будет (возможно) еще удерживаться пользователем в течение неопределенного времени. ( Я использую этот пример, так как я являюсь разработчиком драйвера JDBC, в общем случае этот пример не встречается для разработчика Java, но существуют похожие ситуации )

  2. Обработка относительно больших «одноразовых» объектов в структуре списка или массива. Например: библиотека JavaMail предоставляет методы для получения сообщений; они возвращают массив сообщений. Если вы обрабатываете сообщения последовательно (а затем больше не нуждаетесь в них), обнуление записи массива после обработки может уменьшить объем памяти вашего приложения (с помощью IMAP он может «по требованию» загружать информацию с сервера и сохранять ее в сообщении , увеличивая его размер за счет обработки).

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

Однако, как всегда: не просто null, потому что вы думаете, что это может помочь: null, если вы знаете, что это поможет (профилируйте код, измерьте использование памяти и т. Д.). И если это одноразовое хобби или университетское задание, не беспокойтесь.

0 голосов
/ 09 января 2012

Если это единственная ссылка, то ГХ может освободить место в куче, которую использовал объект.Однако, если есть другая ссылка на тот же объект, тогда установка первой ссылки на null ничего не изменит.Вторая ссылка все еще будет поддерживать объект в живых, поэтому GC не освободит пространство.

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