The Finalize method is used to perform cleanup operations on unmanaged resources held by the current object before the object is destroyed. The method is protected and therefore is accessible only through this class or through a derived class.
It is allowed to call the finalize() method explicitly. It just gets executed like any other method. When you call the finalize() method explicitly, if the garbage collector is currently executing it an unchecked exception will be raised.
Finalization: Just before destroying any object, the garbage collector always calls finalize() method to perform clean-up activities on that object. This process is known as Finalization in Java. Note: The Garbage collector calls the finalize() method only once on any object.
The finalize
method is called when an object is about to get garbage collected. That can be at any time after it has become eligible for garbage collection.
Note that it's entirely possible that an object never gets garbage collected (and thus finalize
is never called). This can happen when the object never becomes eligible for gc (because it's reachable through the entire lifetime of the JVM) or when no garbage collection actually runs between the time the object become eligible and the time the JVM stops running (this often occurs with simple test programs).
There are ways to tell the JVM to run finalize
on objects that it wasn't called on yet, but using them isn't a good idea either (the guarantees of that method aren't very strong either).
If you rely on finalize
for the correct operation of your application, then you're doing something wrong. finalize
should only be used for cleanup of (usually non-Java) resources. And that's exactly because the JVM doesn't guarantee that finalize
is ever called on any object.
In general it's best not to rely on finalize()
to do any cleaning up etc.
According to the Javadoc (which it would be worth reading), it is:
Called by the garbage collector on an object when garbage collection determines that there are no more references to the object.
As Joachim pointed out, this may never happen in the life of a program if the object is always accessible.
Also, the garbage collector is not guaranteed to run at any specific time. In general, what I'm trying to say is finalize()
is probably not the best method to use in general unless there's something specific you need it for.
protected void finalize() throws Throwable {}
- every class inherits the
finalize()
method from java.lang.Object- the method is called by the garbage collector when it determines no more references to the object exist
- the Object finalize method performs no actions but it may be overridden by any class
- normally it should be overridden to clean-up non-Java resources ie closing a file
if overridding
finalize()
it is good programming practice to use a try-catch-finally statement and to always callsuper.finalize()
. This is a safety measure to ensure you do not inadvertently miss closing a resource used by the objects calling classprotected void finalize() throws Throwable { try { close(); // close open files } finally { super.finalize(); } }
any exception thrown by
finalize()
during garbage collection halts the finalization but is otherwise ignoredfinalize()
is never run more than once on any object
quoted from: http://www.janeg.ca/scjp/gc/finalize.html
You could also check this article:
The Java finalize()
method is not a destructor and should not be used to handle logic that your application depends on. The Java spec states there is no guarantee that the finalize
method is called at all during the livetime of the application.
What you problably want is a combination of finally
and a cleanup method, as in:
MyClass myObj;
try {
myObj = new MyClass();
// ...
} finally {
if (null != myObj) {
myObj.cleanup();
}
}
This will correctly handle the situation when the MyClass()
constructor throws an exception.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With