Есть ли какие-либо последствия установки ссылки на нуль в Java? - PullRequest
0 голосов
/ 04 октября 2011

Если у меня есть ссылка, указывающая на некоторый некоторый объект Java, и я выполняю что-то вроде:

myObject=null;

Будет ли "потерянные данные" старого объекта правильно освобожден сборщиком мусора JVM?Нечто подобное в C (с указателем может привести к мусору и возможной утечке памяти).Я использую нулевую атрибуцию в Java-программе и хотел бы, чтобы она была "безопасной".

Ответы [ 6 ]

2 голосов
/ 04 октября 2011

Если myObject содержит только память (скажем, большой внутренний массив), то достаточно установить эту ссылку на null.

Если, с другой стороны, он содержит какой-то другой тип ресурса, который вы выделили (Closeable, Thread, ExecutorService и т. Д.), Вы должны позаботиться о правильном отключении этих ресурсов. 1008 *

Несмотря на то, что некоторые из них могут иметь метод finalize, они могут быть вызваны слишком поздно (или даже никогда), чтобы ваша система имела желаемый эффект.

Это очень распространенная ошибка для тех, кто переключается с C ++ на Java, и я виноват в том, что здесь обвиняется. В моем первом реальном Java-проекте я периодически заканчивал работу с дескриптором файла, потому что я не вызывал close после того, как закончил с ними. Излишне говорить, что с кучей 512 МБ GC никогда не почувствует необходимости начинать завершать мои объекты ввода-вывода, пока не стало слишком поздно.

2 голосов
/ 04 октября 2011

Предполагая, что нет других ссылок на объект, это хороший способ освободить память для GC.(На самом деле, кроме слабых ссылок и тому подобного, это в основном единственный способ: сделать объект недоступным из-за каких-либо живых переменных.) Обратите внимание, что нет расписания для того, когда объект может получить мусор, как только он станет недоступным.1002 * РЕДАКТИРОВАТЬ: Как уже отмечали другие, установка myObject на ноль не является необходимым, если myObject все равно выходит из области видимости.Когда сама переменная больше не доступна как путь для достижения объекта, на который она ссылается, для системы GC не имеет значения, содержит ли она ссылку или ноль.

1 голос
/ 04 октября 2011

Да, иногда ХОРОШАЯ идея установить нулевые ссылки на объекты Java (указатели). Это может (если нет других ссылок на объект) «освободить» объект раньше, чем это произошло бы в противном случае. Это особенно полезно, когда у вас есть большие «сети» переплетенных объектов.

В худшем случае вы стоите один дополнительный магазин памяти.

1 голос
/ 04 октября 2011

Ваше предположение верно, но вам обычно не нужно специально это делать.

Допустим, ваш "myObject" используется в другом объекте.В какой-то момент времени выполнения вашего приложения этот объект перестанет ссылаться на любой другой объект и, таким образом, будет помечен для удаления GC.Их myObject также будет помечен для удаления.Как только все ссылки на данный объект исчезнут, GC в конечном итоге освободит память.

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

1 голос
/ 04 октября 2011

Да, объект, на который указывает ссылка, является приемлемым для сборки мусора (если нет других живых ссылок на объект), когда:

  1. Метод возвращает - если он изначально был создан с локальной областью метода
  2. Немедленно - если это переменная экземпляра или класса
1 голос
/ 04 октября 2011

Да, такова цель сборщика мусора в JVM. В какой-то момент JVM может вызвать метод объекта finalize, а затем отменить соответствующее хранилище.

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