Указывает ли переменная = null ее на сборку мусора - программирование
Подтвердить что ты не робот

Указывает ли переменная = null ее на сборку мусора

Помогите мне решить спор с коллегой: Устанавливает ли переменная или коллекция значение null в Java в сборе мусора и уменьшает использование памяти? Если у меня есть длинная работающая программа, и каждая функция может быть итеративно вызвана (потенциально тысячи раз): Устанавливает ли все переменные в ней значение null, прежде чем возвращать значение родительской функции, помогает уменьшить размер кучи/использование памяти?

4b9b3361

Ответ 1

Это старое представление о производительности. Это было верным в течение 1.0 дней, но компилятор и JVM были улучшены для устранения необходимости (если когда-либо был). Эта отличная статья IBM попадает в детали, если вам интересно: Теория и практика Java: сбор и производительность мусора

Ответ 2

Из статьи:

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

Перевод: "явно нулевые" постоянные объекты, которые больше не нужны. (Если вы хотите. "Практически необходимо" слишком сильное утверждение?)

Ответ 3

Спецификация Java VM

12.6.1 Внедрение завершения Каждый объект может быть охарактеризован двумя атрибутами: он может быть доступен, финализатор доступен или недоступен, а также может быть нефинализирован, финализирован или финализирован.

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

Обсуждение

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

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

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

Еще одна интересная особенность Java заключается в том, что область не отображается в файлах классов, поэтому область не имеет отношения к достижимости; эти два метода создают один и тот же байт-код, и, следовательно, виртуальная машина вообще не видит область созданного объекта:

static void withBlock () {
    int x = 1;

    {
        Object a = new Object();
    }

    System.out.println(x+1);
}

static void withoutBlock () {
    int x = 1;

    Object a = new Object();

    System.out.println(x+1);
}

Ответ 4

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

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

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

Ответ 5

Это бесполезно для локальных переменных, но может быть полезно/необходимо очистить переменные экземпляра, которые больше не требуются (например, после инициализации).

(Да, я знаю, как применить шаблон Builder...)

Ответ 6

Это может иметь смысл только в следующем сценарии:

public void myHeavyMethod() {
  List hugeList = loadHugeListOfStuff();  // lots of memory used
  ResultX res = processHugeList(hugeList); // compute some result or summary 
  // hugeList = null;  // we are done with hugeList
    ...
  // do a lot of other things that takes a LOT of time (seconds?)
  // and which do not require hugeList
   ...
}

Здесь это может принести некоторую выгоду, чтобы раскомментировать строку hugeList = null, я думаю.

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

Ответ 7

Установка ссылки на объект на null только делает его приемлемым для сбора мусора. Это не обязательно освобождает память, которая зависит от того, когда работает сборщик мусора (который зависит от JVM). Когда сборщик мусора работает, он освобождает кучу, удаляя только те объекты, которые имеют право для сбора мусора.

Ответ 8

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