Гарантированно ли финализаторы вызываются в Java? Если это отличается от JVM к JVM, как насчет случая с Dalvik VM для Android?
гарантированно ли финализаторы вызываются в Java?
Ответы (3)
Нет, они не гарантированно будут вызваны. Не полагайтесь на финализаторы для освобождения ресурсов.
https://www.securecoding.cert.org/confluence/display/java/MET12-J.+Do+not+use+finalizers
finalize
, а не finally
- person Bhavik Ambani; 21.12.2012
Вот выдержка из учебника по Java Объект как суперкласс
Метод finalize()
Класс Object предоставляет метод обратного вызова finalize(), который можно вызывать для объекта, когда он становится мусором. Реализация finalize() в объекте ничего не делает — вы можете переопределить finalize() для выполнения очистки, например освобождения ресурсов.
Метод finalize() может быть вызван системой автоматически, но когда он вызывается и даже вызывается ли он, неизвестно. Таким образом, вы не должны полагаться на этот метод, чтобы сделать очистку за вас. Например, если вы не закрываете файловые дескрипторы в своем коде после выполнения ввода-вывода и ожидаете, что finalize() закроет их за вас, у вас могут закончиться файловые дескрипторы.
Последний абзац является важным.
Финализаторы — это то, что должно быть гарантировано выполнено до того, как экземпляры будут восстановлены. Я уверен, что он подчиняется тому же правилу на Dalvik VM. Кроме того, даже финализаторы, наконец, были вызваны, они были выполнены в непредсказуемой точке и специфическим для vm способом, поэтому вам лучше просто использовать его как подстраховку. До JDK 7 единственным способом было экспортировать явный метод освобождения ресурсов для вашего класса и вызывать их явно, когда вы хотите гарантировать, что ресурсы были освобождены. Try-with-resources может избавить вас от ситуации с JDK7. Автозакрытие шоу