Since Object#finalize()'s introduction in JDK 1.0, Java introduced 9 more versions.
Yet, despite its clear shortcomings, it is still available, even in JDK 10.
Oracle itself states in its documentation:
The finalize() Method
The Object class provides a callback method, finalize(), that may be invoked on an object when it becomes garbage. Object's implementation of finalize() does nothing—you can override finalize() to do cleanup, such as freeing resources.
The finalize() method may be called automatically by the system, but when it is called, or even if it is called, is uncertain. Therefore, you should not rely on this method to do your cleanup for you. For example, if you don't close file descriptors in your code after performing I/O and you expect finalize() to close them for you, you may run out of file descriptors.
Which begs the question: Are there any known proper uses of this method?