2010-07-22 18 views
29

я получил следующую фразу в интервью:Java Интервью Вопрос: завершить() метод

Вызов метода объекта финализации() является последней вещью что происходит до того, как объект garbaged собраны.

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

  • Правда
  • Ложный

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

+0

Пожалуйста, прочтите эту статью: http://www.codeguru.com/java/tij/tij0051.shtml –

+0

@Vash, что статья очень устарелый – finnw

ответ

58

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

  1. Первый объект собирают.
  2. Тогда объект завершено.

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

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

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

Подтверждено. * собран * не является конечным состоянием жизненного цикла объекта, он * освобождается *. +1 для связи и обучения чему-то сегодня :) –

+0

Спасибо вам большое. Очень полезное знание. – Cambium

+1

Ссылка не работает! –

2

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

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

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

+8

это не отвечает на вопрос – unbeli

+0

Отчасти ответы вопрос и дает некоторую полезную информацию о том, почему 'finalize()' не так полезен, как думают многие программисты. – Jesper

+0

было бы неплохо распылить полезные мелочи, но даже лучше придерживаться темы. – unbeli

8

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

Цитирую ссылка:

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

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

2

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

1

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

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

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

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

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^