Подтвердить что ты не робот

Вопрос Java-интервью: метод finalize()

Мне дали следующую фразу в интервью:

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

Я должен был ответить:

  • True
  • False

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

4b9b3361

Ответ 1

Порядок отличается:

  • Первый объект собран.
  • Затем объект финализирован.

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

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

  • Созданный
  • В использовании (сильно доступно)
  • Невидимый
  • Недоступен
  • Собрано
  • Завершено
  • высвобождены

Ответ 2

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

Чтобы указать ссылку:

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

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

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

Хороший вопрос в любом случае, потому что вы склонны говорить "да, это правда".

Ответ 6

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