According to this post, in .Net,
Finalizers are actually even worse than that. Besides that they run late (which is indeed a serious problem for many kinds of resources), they are also less powerful because they can only perform a subset of the operations allowed in a destructor (e.g., a finalizer cannot reliably use other objects, whereas a destructor can), and even when writing in that subset finalizers are extremely difficult to write correctly. And collecting finalizable objects is expensive: Each finalizable object, and the potentially huge graph of objects reachable from it, is promoted to the next GC generation, which makes it more expensive to collect by some large multiple.
Does this also apply to JVMs in general and to HotSpot in particular?
Here are some select quotes from Effective Java 2nd Edition: Item 7: Avoid finalizers:
You should really make sure that in fact, you DO need finalizers; most of the time you DON’T.
The semantics of when finalizers are invoked is also important to consider:
Moreover, the only mechanism to run finalizer on demand is broken. The following quotes are from Effective Java 2nd Edition:
Bloch went further to comment on the performance penalty (emphasis his):
With such little details on the benchmarking methodology, I don’t think the specific numbers mean much, but it does confirm what have been widely documented: finalizers are very costly.
The book does explain the rare scenarios under which using finalizers is valid. The omission of those quotes from this answer is intentional.