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