Определение: нефинализируемый и финализируемый объект

Чтобы понять слабые ссылки в Java, мне пришлось обратиться к Спецификации языка Java. Следующая часть из раздела 12.6 меня озадачивает:

Финализатор незавершенного объекта никогда не вызывался автоматически; финализатор завершенного объекта вызывается автоматически. Финализатор объекта никогда не вызывался автоматически, но виртуальная машина Java может в конечном итоге автоматически вызвать его финализатор.

Так в чем же формальная разница между незавершенным и финализируемым объектом? Из цитаты видно, что если unfinalized и finalizable должны быть разными, то для незавершенного объекта должно быть так, что не верно, что JVM может в конечном итоге вызвать свой финализатор. Немного запутанно, или мне все еще нужно изучить английскую семантику;)

Ссылка на раздел спецификации Java: Реализация финализации


person Alto Nordica    schedule 15.06.2011    source источник


Ответы (3)


Разница между незавершенным и финализируемым объектом заключается в том, что финализатор второго может автоматически вызываться в любое время в будущем, а финализатор незавершенного объекта не может. strong> вызываться автоматически, если только объект не становится финализируемым.

  • нефинализированный объект не будет получать финализатор, автоматически вызываемый JVM в этом состоянии
  • финализируемый объект может в конечном итоге получить свой финализатор, автоматически вызываемый JVM
person Joachim Sauer    schedule 15.06.2011

Ответ, кажется, лежит в этой строке:

Если виртуальная машина Java обнаруживает, что незавершенный объект стал доступным или недостижимым для финализатора, она может пометить объект как завершающий (G, H);

Незавершенные объекты еще не подлежат финализации. Они доступны. Finalizable объекты имеют право быть финализированными, поэтому JVM может сделать это, когда захочет. Другими словами, «может» в смысле «имеет разрешение на», а не только в смысле «это может произойти».

person Yishai    schedule 15.06.2011

Нет никакой гарантии, что когда-либо будет выполнена сборка мусора или что finalize() будет когда-либо вызвана. Велика вероятность, что когда-нибудь это произойдет.

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

person Peter Lawrey    schedule 15.06.2011
comment
вы имеете в виду ... если до сих пор нет сильной ссылки на это. не ссылка на строку... - person Yaneeve; 15.06.2011