гарантированно ли финализаторы вызываются в Java?

Гарантированно ли финализаторы вызываются в Java? Если это отличается от JVM к JVM, как насчет случая с Dalvik VM для Android?


person dacongy    schedule 21.12.2012    source источник
comment
Слишком много дубликатов для перечисления. Пожалуйста, поищите сначала. stackoverflow.com/questions/12030641/, stackoverflow.com/questions/12461995/ , stackoverflow.com /questions/9540114/ , stackoverflow.com/questions/2954948/ (хотя это не все точные дубликаты, информация, необходимая для ответа на этот Пост обильный и легко находящийся)   -  person    schedule 21.12.2012
comment
Хотя я дал ссылку на вопросы выше, было бы неплохо получить четкий ответ, посвященный реализации Dalvik финализаторов/GC, который может (или не может) добавить гарантии выше JLS/JCL и эталонные JVM.   -  person    schedule 21.12.2012
comment
Dalvik не является JVM и не хочет ею быть.   -  person Jörg W Mittag    schedule 21.12.2012
comment
Насколько я знаю, в HostSpot VM финализаторы будут вызываться до того, как объекты будут GC.   -  person lichengwu    schedule 21.12.2012


Ответы (3)


Нет, они не гарантированно будут вызваны. Не полагайтесь на финализаторы для освобождения ресурсов.

https://www.securecoding.cert.org/confluence/display/java/MET12-J.+Do+not+use+finalizers

person Oh Chin Boon    schedule 21.12.2012
comment
ОП запросил finalize, а не finally - person Bhavik Ambani; 21.12.2012
comment
+1 за ссылку на попытку с ресурсами - person lpinto.eu; 21.12.2012

Вот выдержка из учебника по Java Объект как суперкласс

Метод finalize()

Класс Object предоставляет метод обратного вызова finalize(), который можно вызывать для объекта, когда он становится мусором. Реализация finalize() в объекте ничего не делает — вы можете переопределить finalize() для выполнения очистки, например освобождения ресурсов.

Метод finalize() может быть вызван системой автоматически, но когда он вызывается и даже вызывается ли он, неизвестно. Таким образом, вы не должны полагаться на этот метод, чтобы сделать очистку за вас. Например, если вы не закрываете файловые дескрипторы в своем коде после выполнения ввода-вывода и ожидаете, что finalize() закроет их за вас, у вас могут закончиться файловые дескрипторы.

Последний абзац является важным.

person Kevin S    schedule 21.12.2012

Финализаторы — это то, что должно быть гарантировано выполнено до того, как экземпляры будут восстановлены. Я уверен, что он подчиняется тому же правилу на Dalvik VM. Кроме того, даже финализаторы, наконец, были вызваны, они были выполнены в непредсказуемой точке и специфическим для vm способом, поэтому вам лучше просто использовать его как подстраховку. До JDK 7 единственным способом было экспортировать явный метод освобождения ресурсов для вашего класса и вызывать их явно, когда вы хотите гарантировать, что ресурсы были освобождены. Try-with-resources может избавить вас от ситуации с JDK7. Автозакрытие шоу

person Charles Zhang    schedule 21.12.2012