Делает переменную = пустое множество это для сборки "мусора"

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

52
задан ashurexm 28 May 2010 в 06:28
поделиться

7 ответов

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

59
ответ дан 7 November 2019 в 09:29
поделиться

Из статьи:

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

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

7
ответ дан 7 November 2019 в 09:29
поделиться

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

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

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

3
ответ дан 7 November 2019 в 09:29
поделиться

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

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

2
ответ дан 7 November 2019 в 09:29
поделиться

Это могло иметь некоторый смысл только в некотором сценарии, подобном этому:

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 , Наверное.

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

1
ответ дан 7 November 2019 в 09:29
поделиться

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

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

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

Обсуждение

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

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

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

Другой интересной особенностью 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);
}
5
ответ дан 7 November 2019 в 09:29
поделиться

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

-4
ответ дан 7 November 2019 в 09:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: