Когда finalize () вызывается во время сборки мусора? - PullRequest
0 голосов
/ 23 декабря 2018

От:

Q11 из https://www.baeldung.com/java-memory-management-interview-questions

Когда объект получает право на сборку мусора, сборщик мусора должен запустить на нем finalize ();этот метод гарантированно будет запущен только один раз, поэтому сборщик помечает объект как завершенный и дает ему отдохнуть до следующего цикла.

У меня есть несколько вопросов:

  • Это утверждение верно?
  • На этапе разметки сборщик мусора вызывает метод finalize ()?
  • Почему он дает отдых до следующего цикла?

PS: я понимаю, что finalize () окончательно устарела в Java 9. Благодаря доброй душе, которая решила сделать это.

1 Ответ

0 голосов
/ 23 декабря 2018

На этапе разметки сборщик мусора вызывает метод finalize ()?

Зависит от реализации, но обычно нет.Финализатор вызывается фоновым потоком после завершения GC.

Помните, что GC может быть событием остановки мира и должно быть как можно короче.Методы финализатора могут быть медленными, поэтому их не следует вызывать во время GC.

Почему он дает отдых до следующего цикла?

На высоком уровне (упрощенно), он работает следующим образом (см. JLS 12.6.1 ):

  • GC обнаруживает объекты, которые не достижимы :

    • Если у объекта есть метод финализатора, добавьте его в очередь финализатора.
      Объект финализируется .

    • Если объект доступен из финализуемого объекта, оставьте его.
      Объект доступен для финализатора .

    • В противном случае освободите памятьсейчас.
      Объект был недоступен .

  • Фоновый поток потоков Финализатора обрабатывает в очереди finalizable объекты:

    • Вызывает метод finalize().
      Когда метод возвращается, объект завершен .
  • Поскольку GC ужезавершено, finalized объекты "отдыхают" до следующего цикла GC.

  • В следующем цикле GC объекты с методом финализатора, помеченным finalized , являютсярассматривается как недоступный , и память будет возвращена (при условии, что метод финализатора не сделал объект достижимым снова).

Обратите внимание, что многиеЦиклы GC могут возникать, когда объект finalizable , т. Е. Потоку Finalizer может потребоваться некоторое время для обработки объекта.

...