Java: влияют ли пустые финализаторы на производительность?

Я знаю, что финализаторы в Java имеют серьезные проблемы с производительностью — подробности см. в этой ветке: ">Почему финализаторы сильно снижают производительность?

Теперь у меня есть сценарий, в котором я хочу запретить подклассам определенного класса иметь финализаторы. AfaIk, это можно сделать, добавив финальный пустой финализатор:

    protected final void finalize() throws Throwable {}

Будет ли такой пустой финализатор уже вызывать известные проблемы с производительностью? Или сборщик мусора обнаружит его как пустой финализатор и обработает объекты как обычные нефинализируемые объекты?

Причиной этого является фреймворк, использующий собственный контролируемый процесс финализации. Пользователи, реализующие подклассы упомянутого класса, могут нарушить этот процесс, добавив свои собственные финализаторы Java. Кроме того, это заставит их использовать предполагаемый процесс завершения, если завершение вообще необходимо.


person stewori    schedule 30.07.2014    source источник
comment
Протестировать и поделиться результатами?   -  person Kayaman    schedule 30.07.2014
comment
Проблемы с производительностью? Это своего рода нано-оптимизация, о которой вам не следует беспокоиться, если вы не измерили свое приложение и не имеете доказательств того, что причиной являются финализаторы. Ваш код, скорее всего, будет источником проблем с производительностью.   -  person duffymo    schedule 30.07.2014
comment
Вы знаете, что это всего лишь один из способов серьезно снизить эффективность сборщика мусора, и вам нужно программировать, стуча головой о клавиатуру, чтобы совершить эту ошибку. Ты действительно хочешь зайти так далеко?   -  person Gimby    schedule 30.07.2014
comment
Не могли бы вы уточнить, почему это может снизить эффективность сборщика мусора, если запретить финализаторы для определенных классов?   -  person stewori    schedule 31.07.2014


Ответы (1)


Нет, пустые финализаторы не влияют на производительность; они оптимизируются, чтобы механизм Finalizer мог их игнорировать. Эта ссылка подразумевает это, и в этом это прямо указано.

К счастью, когда наш метод finalize() тривиален, то есть имеет пустое тело, он игнорируется механизмом Finalizer.

person resueman    schedule 30.07.2014