Never rely on finalize
You cannot rely on finalize to always reclaim resources. Instead, if an object has resources which need to be recovered, it must define a method for this very purpose - for example a cleanupResources method, or a dispose method. The caller is then required to use such a method in order to ensure that the related resources are recovered.
For an extensive discussion, please see the "Avoid Finalizers" topic in Effective Java.
See Also :
Would you use this technique?