Вот несколько избранных цитат из Effective Java 2nd Edition: Пункт 7. Избегайте финализаторов:
Финализаторы непредсказуемы, часто опасны и, как правило, не нужны. Их использование может вызвать нестабильное поведение, низкую производительность и проблемы с переносимостью. Финализаторы имеют мало допустимых применений, [...] как правило, вам следует избегать финализаторов.
Вы действительно должны убедиться, что на самом деле вам нужны финализаторы; большую часть времени вы НЕ ДЕЛАЕТЕ.
Программистов на C++ предупреждают, чтобы они не думали о финализаторах как о Java-аналоге деструкторов C++. В C++ деструкторы — это обычный способ освобождения ресурсов, связанных с объектом, необходимый аналог конструкторов. В Java сборщик мусора освобождает память, связанную с объектом, когда он становится недоступным, не требуя особых усилий со стороны программиста. Деструкторы C++ также используются для освобождения других ресурсов, не связанных с памятью. В Java для этой цели обычно используется блок try-finally
.
Также важно учитывать семантику когда финализаторов:
Язык программирования Java не определяет, как скоро будет вызван finalizer
[...ни] какой поток будет вызывать финализатор для любого данного объекта. [...] Если во время завершения возникает неперехваченное исключение, исключение игнорируется, и завершение этого объекта завершается. (JLS 12.6.2) Вызовы Finalizer не Заказал
Более того, сломан единственный механизм запуска финализатора по требованию. Следующие цитаты взяты из Effective Java 2nd Edition:
[...] Единственные методы, которые утверждают, что гарантируют завершение, - это System.runFinalizersOnExit
и его злой близнец, Runtime.runFinalizersOnExit
. Эти методы фатально ошибочны и устарели.
Блох пошел дальше, комментируя штраф за производительность (выделено его):
Да, и еще кое-что: использование финализаторов приводит к серьезному снижению производительности. На моей машине время создания и уничтожения простого объекта составляет около 5,6 нс. Добавление финализатора увеличивает время до 2400 нс. Другими словами, создание и уничтожение объектов с финализаторами происходит примерно в 430 раз медленнее.
С такими небольшими подробностями о методологии бенчмаркинга, я не думаю, что конкретные цифры много значат, но они подтверждают то, что было широко задокументировано: финализаторы очень дороги.
В книге объясняются редкие сценарии, в которых допустимо использование финализаторов. Опущение этих цитат из этого ответа является преднамеренным.
person
polygenelubricants
schedule
02.06.2010