Вопрос по Java: метод finalize()

в интервью мне была дана следующая фраза:

вызов объекта метод finalize () - это последнее дело что происходит до объекта garbaged собираются.

Я ответил:

  • правда
  • False

Я выбрал True но он ошибался. Объясните, пожалуйста, почему ?

6 ответов


порядок другой:

  1. первый объект собрал.
  2. затем объект завершен.

см.http://java.dzone.com/articles/ocajp-7-object-lifecycle-java

жизненный цикл объекта:

  1. создано
  2. в использовании (сильно достижимый)
  3. Невидимка
  4. недоступен
  5. собрал
  6. завершен
  7. освобожден

Я думаю, это намекает на то, что на самом деле есть другие вещи, которые могут быть сделаны / произойти с объектом, прежде чем GC действительно отбросит его.

цитирую ссылку:

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

таким образом, в этом свете процесс завершения не является последним, прежде чем GC отбросит его.


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

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

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


Я думаю, вы можете защитить оба ответа,finalize() вызывается сборщиком мусора до того, как он соберет объект, но вы не можете быть уверены, что это будет когда-либо до окончания apllication. Не все объекты, которые allegible, чтобы быть собранным "мусор" должны быть талая. Вы никогда не можете зависеть от finalize() метод, вызываемый для любого объекта.


порядок неправильный, как DR уже показали.

объект меняет свое состояние на собрал когда gc распознал, что объект недоступен.

Так кто следует ли принять меры для завершения объекта до обнаружения этого "недостижимого" состояния? Фактически это сборщик мусора, который помечает собранные объекты для завершения (если метод finalize объектов переопределен). И мы действительно не хотим завершите объекты, которые все еще доступны, например "в использовании".

хороший вопрос в любом случае, потому что вы склонны сказать Да, это правда'.


вы можете воскресить объект в finalize метод, сделав что-то указать на него, чтобы объект не мог быть собран GC после вызова finalized метод. но когда объект снова становится доступным для сборки мусора, он не вызывает завершенный метод этого объекта, поскольку он был отмечен / помечен как завершенный. поэтому перед GC может произойти вызов метода finalize или объект может воскреснуть.