Вопрос об Интервью Java: завершите () метод

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

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

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

  • Верный
  • Ложь

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

29
задан Konrad Garus 22 July 2010 в 08:21
поделиться

5 ответов

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

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

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

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

  1. Created
  2. In use (strongly reachable)
  3. Invisible
  4. Unreachable
  5. Collected
  6. Completeded
  7. Deallocated
59
ответ дан 28 November 2019 в 01:05
поделиться

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

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

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

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

8
ответ дан 28 November 2019 в 01:05
поделиться

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

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

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

2
ответ дан 28 November 2019 в 01:05
поделиться

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

2
ответ дан 28 November 2019 в 01:05
поделиться

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

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

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

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

1
ответ дан 28 November 2019 в 01:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: