Спецификация Java VM
12.6.1 Реализация финализации Каждый объект может характеризоваться двумя атрибутами: он может быть достижимым, достижимым для финализатора или недоступным, а также может быть незавершенным, финализируемымили завершено.
Достижимым объектом является любой объект, к которому можно получить доступ в любом потенциальном продолжающемся вычислении из любого живого потока .Могут быть разработаны оптимизирующие преобразования программы, которые уменьшают число достижимых объектов до меньшего, чем те, которые наивно считаются достижимыми.Например, компилятор или генератор кода может установить переменную или параметр, которые больше не будут использоваться для обнуления, чтобы в будущем хранилище для такого объекта могло быть потенциально восстановимо.
Обсуждение
Другой пример этого происходит, если значения в полях объекта хранятся в регистрах.Программа может затем получить доступ к регистрам вместо объекта и никогда не получить доступ к объекту снова.Это будет означать, что объект является мусором.
Объект достижим, если он может быть вовлечен в любые потенциальные продолжающиеся вычисления.Так что, если ваш код ссылается на локальную переменную, и ничто иное не ссылается на нее, то вы можете заставить объект быть собранным, установив его в 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);
}