Метод придуман для минимизации риска утечки внешних ресурсов.
Может быть вызван виртуальной машиной при сборке мусора (добавляя при этом для нее избыточную нагрузку). Это
не то же самое, что деструктор в C++.
Есть только гарантии, что метод не будет вызван пока есть ссылки на объект, и что не будет вызван больше одного раза. Даже то, что вызов будет вообще – не факт. Исполнять будет неизвестно какой, но не синхронизированный поток. Исключения проигнорируются.
С давних пор использовать финализаторы
не рекомендуется (
Effective Java Item 7), а с Java 9 этот метод помечен как deprecated. Вместо финализатора всегда стоит воспользоваться
try/finally,
try-with-resource или более специализированными классами пакета
java.lang.ref.