Я читал «Эффективное программирование на Java» Джошуа Блоха. В этой книге он советует не использовать блок «finalize», поскольку его выполнение не гарантируется. Может ли кто-нибудь объяснить немного больше об этом или дать ссылку на какую-то статью, которая объясняет это в деталях?
Проблема с блоком finalize
Ответы (3)
Одна проблема с finalize заключается в том, что он не будет вызываться, если ваша программа вызывает System.exit()
- чтобы справиться с этим, я думаю, Джош Блок предлагает вместо этого использовать Runtime.addShutdownHook()
.
Еще одна проблема с финализаторами, помимо упомянутой andrewmu, связана с часто создаваемыми/удаляемыми объектами.
Когда вы определяете финализатор для класса с высокой скоростью создания/уничтожения, вы добавляете нагрузку на поток финализатора, что может замедлять скорость сборки мусора для этих объектов. Вместо того, чтобы освобождаться сразу после сборки мусора, эти объекты ждут в очереди потока финализатора, чтобы быть финализированными первыми. Это увеличивает риск ошибки нехватки памяти.
плюс: если вы забудете вызвать super.finalize(), это может быть ошибкой. поэтому реализация finalize() подвержена ошибкам.