Проблема с блоком finalize

Я читал «Эффективное программирование на Java» Джошуа Блоха. В этой книге он советует не использовать блок «finalize», поскольку его выполнение не гарантируется. Может ли кто-нибудь объяснить немного больше об этом или дать ссылку на какую-то статью, которая объясняет это в деталях?


person Vishal    schedule 05.08.2010    source источник
comment
Почему вы планировали использовать финализаторы? Я думаю, что наиболее распространенная проблема с финализаторами в Java заключается в том, что люди думают, что они действуют так же, как деструкторы в C++. :) (Кроме того, ваша формулировка блока finalize может привести к путанице с блоками finally. Финализаторы сами по себе не являются блоками.)   -  person bzlm    schedule 05.08.2010
comment
Вы уверены, что они имеют в виду финализацию блоков, а не финализацию методов?   -  person Marcus Johansson    schedule 05.08.2010
comment
Это не дубликаты, а очень тесно связанные stackoverflow.com/questions/2954948/ (много цитат из статьи из книги); stackoverflow .com/questions/3038211/ ; stackoverflow.com/ вопросы/2860121/   -  person polygenelubricants    schedule 05.08.2010
comment
Нет. Я не планирую их использовать. Я просто хочу знать, почему их не рекомендуется использовать? Почему они запрещены, например операторы goto в C?   -  person Vishal    schedule 05.08.2010
comment
Если вы читали «Эффективная Java», то там есть довольно подробная информация о методе finalize. Прочитайте пункт 6   -  person naikus    schedule 05.08.2010
comment
@bzlm Спасибо, что исправили это. :) @naikus Да, в этих книгах есть подробное объяснение. Но сейчас у меня нет с собой этой книги. :( Я только что прочитал немного этой темы, прежде чем друг позаимствовал ее.   -  person Vishal    schedule 05.08.2010


Ответы (3)


Одна проблема с finalize заключается в том, что он не будет вызываться, если ваша программа вызывает System.exit() - чтобы справиться с этим, я думаю, Джош Блок предлагает вместо этого использовать Runtime.addShutdownHook().

person andrewmu    schedule 05.08.2010

Еще одна проблема с финализаторами, помимо упомянутой andrewmu, связана с часто создаваемыми/удаляемыми объектами.

Когда вы определяете финализатор для класса с высокой скоростью создания/уничтожения, вы добавляете нагрузку на поток финализатора, что может замедлять скорость сборки мусора для этих объектов. Вместо того, чтобы освобождаться сразу после сборки мусора, эти объекты ждут в очереди потока финализатора, чтобы быть финализированными первыми. Это увеличивает риск ошибки нехватки памяти.

person Eyal Schneider    schedule 05.08.2010

плюс: если вы забудете вызвать super.finalize(), это может быть ошибкой. поэтому реализация finalize() подвержена ошибкам.

person 卢声远 Shengyuan Lu    schedule 21.08.2010