Пример кода предназначен для иллюстрации последнего предложения вашего цитируемого текста: « Обратите внимание, что такого рода оптимизация разрешена, только если ссылки находятся в стеке, а не хранятся в куче », и этонемного странно, что вы сорвали его с поясняющего текста:
Например, рассмотрим шаблон Finalizer Guardian :
class Foo {
private final Object finalizerGuardian = new Object() {
protected void finalize() throws Throwable {
/* finalize outer Foo object */
}
}
}
Финализатор заставляет super.finalize
вызываться, если подкласс переопределяет finalize
и не вызывает явно super.finalize
.
Если эти оптимизации разрешены для ссылок, которыесохраненный в куче, компилятор Java может обнаружить, что поле finalizerGuardian
никогда не читается, обнулить его, немедленно собрать объект и вызвать финализатор на ранней стадии.Это противоречит цели: программист, вероятно, хотел вызвать финализатор Foo, когда экземпляр Foo стал недоступен.Поэтому такого рода преобразование недопустимо: внутренний объект класса должен быть достижимым до тех пор, пока доступен внешний объект класса.
Таким образом, пример кода иллюстрирует ограничение.«Оптимизирующие преобразования», упомянутые в спецификации, включают масштабирование объектов, примененное после того, как Escape Analysis доказал, что объект является чисто локальным, иными словами, оптимизируемый код охватывает весь срок жизни объекта.
Но это не так.не нужны такие местные объекты.Как уже упоминалось в спецификации, оптимизированный код может сохранять поля объекта в регистрах ЦП без необходимости их повторного чтения, таким образом, больше не нужно сохранять ссылку на объект.Аналогично, ссылочная переменная, все еще находящаяся в области видимости, может не использоваться.Если эта ссылка была единственной ссылкой на объект, удаление ее из оптимизированного кода позволяет выполнять более раннюю сборку мусора.
В обоих сценариях все равно можно было бы удалить или собрать экземпляр Foo
ранее.Это, в свою очередь, позволило бы более раннюю коллекцию объекта (больше не), на который ссылается finalizerGuardian
.Но это не противодействует намерению этого ограничения.Спецификация ограничивает оптимизацию, чтобы не позволить внутреннему объекту быть собранным раньше, чем внешний объект, но нет проблем в сборе обоих вместе, в том числе раньше, чем наивно ожидалось.
Как правило, могут быть получены произвольно большие графы объектовсобирается за один цикл сбора мусора, возможно, раньше, чем наивно ожидалось, или даже полностью оптимизируется.