На этапе разметки сборщик мусора вызывает метод finalize ()?
Зависит от реализации, но обычно нет.Финализатор вызывается фоновым потоком после завершения GC.
Помните, что GC может быть событием остановки мира и должно быть как можно короче.Методы финализатора могут быть медленными, поэтому их не следует вызывать во время GC.
Почему он дает отдых до следующего цикла?
На высоком уровне (упрощенно), он работает следующим образом (см. JLS 12.6.1 ):
GC обнаруживает объекты, которые не достижимы :
Если у объекта есть метод финализатора, добавьте его в очередь финализатора.
Объект финализируется .
Если объект доступен из финализуемого объекта, оставьте его.
Объект доступен для финализатора .
В противном случае освободите памятьсейчас.
Объект был недоступен .
Фоновый поток потоков Финализатора обрабатывает в очереди finalizable объекты:
- Вызывает метод
finalize()
.
Когда метод возвращается, объект завершен .
Поскольку GC ужезавершено, finalized объекты "отдыхают" до следующего цикла GC.
В следующем цикле GC объекты с методом финализатора, помеченным finalized , являютсярассматривается как недоступный , и память будет возвращена (при условии, что метод финализатора не сделал объект достижимым снова).
Обратите внимание, что многиеЦиклы GC могут возникать, когда объект finalizable , т. Е. Потоку Finalizer может потребоваться некоторое время для обработки объекта.