[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-java-core-chto-proizoydet-so-sborshchikom-musora-esli-vypolnenie-metoda-finalize-trebuet-oshchutimo-mnogo-vremeni-ili-v-protsesse-vypolneniya-budet-vybrosheno-isklyuchenie":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":19,"progress":20,"seo":21},59,"chto-proizoydet-so-sborshchikom-musora-esli-vypolnenie-metoda-finalize-trebuet-oshchutimo-mnogo-vremeni-ili-v-protsesse-vypolneniya-budet-vybrosheno-isklyuchenie",2,"java-core","Java Core","☕","Что произойдет со сборщиком мусора, если выполнение метода `finalize()` требует ощутимо много времени, или в процессе выполнения будет выброшено исключение?","Непосредственно вызов `finalize()` происходит в отдельном потоке Finalizer (`java.lang.ref.Finalizer.FinalizerThread`), который создаётся при запуске виртуальной машины (в статической секции при загрузке класса `Finalizer`). Методы `finalize()` вызываются последовательно в том порядке, в котором были добавлены в список сборщиком мусора. Соответственно, если какой-то `finalize()` зависнет, он подвесит поток Finalizer, но не сборщик мусора. Это в частности означает, что объекты, не имеющие метода `finalize()`, будут исправно удаляться, а вот имеющие будут добавляться в очередь, пока поток Finalizer не освободится, не завершится приложение или не кончится память.\n\nТо же самое применимо и выброшенным в процессе `finalize()` исключениям: метод `runFinalizer()` у потока Finalizer игнорирует все исключения выброшенные в момент выполнения `finalize()`. Таким образом возникновение исключительной ситуации никак не скажется на работоспособности сборщика мусора.","","middle",[15,16,17,18],"jvm","core","garbage-collection","finalize",[],null,{"title":22,"description":23,"ogTitle":22,"ogDescription":24,"keywords":25,"schemaAnswer":32,"featuredSnippetReady":33},"Поведение GC при долгом finalize() или исключении — Gymterview","Как ведёт себя сборщик мусора Java, если finalize() выполняется долго или выбрасывает исключение. Поток Finalizer и его влияние на GC.","Метод finalize() выполняется в отдельном потоке Finalizer — зависание или исключение не блокирует сборщик мусора.",[18,26,27,28,29,30,31],"сборщик мусора","Finalizer","исключение","garbage collector","Java","FinalizerThread","Вызов finalize() происходит в отдельном потоке Finalizer (java.lang.ref.Finalizer.FinalizerThread). Методы finalize() вызываются последовательно. Если finalize() зависнет, он подвесит поток Finalizer, но не сам сборщик мусора. Объекты без finalize() будут исправно удаляться, а имеющие finalize() будут копиться в очереди. Исключения, выброшенные в finalize(), игнорируются потоком Finalizer и не влияют на работу GC.",true]