Java Интервью Вопрос: метод finalize () - PullRequest
29 голосов
/ 22 июля 2010

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

вызов объекта Метод finalize () - это последнее, что нужно это происходит до того, как объект наряд собрал.

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

  • Правда
  • Ложная

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

Ответы [ 6 ]

59 голосов
/ 22 июля 2010

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

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

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

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

  1. Создано
  2. Используется (доступно)
  3. Невидим
  4. Недоступен
  5. Собрано
  6. Завершено
  7. выделено
8 голосов
/ 22 июля 2010

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

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

2 голосов
/ 22 июля 2010

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

2 голосов
/ 22 июля 2010

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

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

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

1 голос
/ 22 июля 2010

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

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

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

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

0 голосов
/ 03 июля 2015

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

...