Мне дали следующую фразу в интервью:
Вызов Объекта завершает (), метод является последней вещью, которая происходит, прежде чем объект является собранным garbaged.
Я должен был ответить:
Я выбрал True
но это было неправильно. Можно ли объяснить меня почему?
Порядок другой:
См. http://java.dzone.com/articles/ocajp-7-object-lifecycle-java
Жизненный цикл объекта:
- Created
- In use (strongly reachable)
- Invisible
- Unreachable
- Collected
- Completeded
- Deallocated
Я думаю, это намекает на то, что на самом деле есть другие вещи, которые могут быть сделаны / произойти с объектом до того, как ГК действительно отбросит его.
Цитирую ссылку:
[...] Метод доработки может принимать любой действие, включая создание этого объекта снова доступен для других потоков; обычная цель доработки, Однако необходимо выполнить действия по очистке до того, как объект будет безвозвратно отброшен. Например, финализация для объекта, представляющего Подключение ввода-вывода может выполнять явные транзакции ввода-вывода для Разорвать соединение перед объект является постоянным Отбрасываются. [...]
Таким образом, в этом свете процесс завершения не является последним, прежде чем GC отбросит его.
Нет никакой гарантии, что finalize ()
будет всегда вызываться, или даже что сборка мусора будет запущена вообще.
Предположим, что ваша программа завершается (либо путем вызова System.exit ()
, либо когда все запущенные потоки достигают своего конца), тогда JVM просто завершает работу, она не очищает все и не вызывает finalize ()
для всех объектов.
Следовательно, размещение задач очистки, которые обязательно должны выполняться, в методе finalize ()
не является хорошей идеей.
Я думаю, вы можете защитить оба ответа, finalize()
вызывается сборщиком мусора до того, как он соберет объект, но вы не можете быть уверены, что это когда-либо произойдет до окончания приложения. Не все объекты, которые, как утверждается, являются мусором, должны быть отобраны. Возможно, вы никогда не будете зависеть от метода finalize()
, который будет вызываться для любого объекта.
Порядок неправильный, как уже показал DR.
Объект меняет свое состояние на собран, когда gc признает, что объект недоступен.
Итак, кто должен предпринять действия по финализации объекта до того, как было обнаружено это состояние "недостижимости"? На самом деле это сборщик мусора, который помечает собранные объекты для финализации (если метод finalize объекта переопределен). И мы действительно не хотим финализировать объекты, которые все еще доступны, например, "в использовании".
Хороший вопрос в любом случае, потому что вы склонны отвечать "да, это так".