Присвоение «нуля» объектам в каждом приложении после их использования - PullRequest
6 голосов
/ 04 декабря 2009
  • Вы всегда присваиваете объекту null после того, как достигнут его объем?

  • Или вы полагаетесь на JVM для сборки мусора?

  • Вы делаете это для всех видов приложений, независимо от их длины?

  • Если да, то всегда ли это хорошая практика?

Ответы [ 14 ]

11 голосов
/ 04 декабря 2009

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

8 голосов
/ 04 декабря 2009
  • нет, не делайте этого, за исключением особых случаев, таких как статические поля или когда вы знаете переменная / поле живет лот дольше, чем код, ссылающийся на него
  • да, но с практическим знанием пределов вашей виртуальной машины (и как заставить блоки памяти случайно удерживаться)
  • н / * * 1 010
6 голосов
/ 04 декабря 2009

Я объявляю почти все мои переменные как "final". Я также делаю свои методы маленькими и объявляю большинство переменных локальными для методов.

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

2 голосов
/ 04 декабря 2009

Мы не практикуем это присвоение «ноль». Если область видимости переменной достигла своего конца, она уже должна быть готова для GC. Могут быть некоторые крайние случаи, когда область действия длится некоторое время дольше из-за длительной операции, и в этом случае может иметь смысл установить ее на ноль, но я думаю, что они будут редкими.

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

2 голосов
/ 04 декабря 2009

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

2 голосов
/ 04 декабря 2009

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

1 голос
/ 04 декабря 2009

Я назначаю ссылку на null только тогда, когда:

  1. Код на самом деле лежит в критической части памяти.
  2. Ссылка имеет широкий охват (и должен быть повторно использован позже). Если это не так, я просто объявляю это в наименьшем возможном блоке кода. Он будет доступен для сбора автоматически.

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

В этом случае (и только в этом случае) я затем вызываю System.gc(), чтобы дать подсказку сборщику мусора. Я отслеживал эту технику с помощью визуализатора кучи, и она очень хорошо работает для больших коллекций (более 500 МБ данных).

1 голос
/ 04 декабря 2009

Один раз, когда я склонен использовать эту практику, мне нужно преобразовать большое Collection в какую-то раннюю часть метода.

Например:

public void foo() {
  List<? extends Trade> trades = loadTrades();
  Map<Date, List<? extends Trade>> tradesByDate = groupTradesByDate(trades);
  trades = null; // trades no longer required.

  // Apply business logic to tradesByDate map.
}

Очевидно, что я мог бы уменьшить потребность в этом, изменив это на другой метод: Map<Date, List<? extends Trade>>> loadTradesAndGroupByDate(), так что это действительно зависит от обстоятельств / ясности кода.

1 голос
/ 04 декабря 2009

Присвоение выполняется не объектам, а переменным, и это означает, что эта переменная содержит ссылку на некоторый объект. Присвоение NULL переменной не является способом уничтожения объекта, оно просто очищает одну ссылку. Если очищаемая вами переменная впоследствии все равно покинет свою область, назначение NULL - это просто бесполезный шум, потому что это происходит при выходе из области действия в любом случае.

1 голос
/ 04 декабря 2009

Как уже упоминали другие, обычно это не нужно.

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

...