オブジェクトがfinalize()をオーバーライドした場合、次の問題点があります。
finalize()をオーバーライドしたオブジェクトの場合は、Javaプログラムにおける参照がなくなっても、ガーベジコレクション(GC)実行時にすぐ回収されません。これは、GC後にfinalize()を実行するように、Java VMによる参照が残っているためです。
GC後にfinalize()が実行される保証はありません。
finalize()が実行される順番は不定です。
次の処理により、finalize()が実行され、かつ、オブジェクトが回収されるような記事を見かけることがありますが、確実ではありません。
java.lang.System.gc(); java.lang.System.runFinalization(); java.lang.System.gc();
このため、原則としてJavaプログラムでは、java.lang.Object.finalize()をオーバーライドしないでください。
例
GC実行時にfinalize()が必ず呼ばれることを期待して、finalize()をオーバーライドして、終了処理を定義した事例があります。しかし、実際は、finalize()が期待通りのタイミングで実行されなかったため、終了処理が実行されずメモリリークの原因となりました。