Regarding your query
If you want to do some cleanup when the jvm exits, why not just overload the finalize method of the daemon class
I have found good information from this article
finalize()
is called before Garbage collector reclaim the Object. JVM does not guaranty when this method will be invoked.
finalize()
gets called only once by GC thread if object revives itself from finalize method than finalize will not be called again.
In your application, you may have some live objects, on which garbage collection is never invoked.
Any Exception is thrown by finalize method is ignored by GC thread
System.runFinalization(true)
and Runtime.getRuntime().runFinalization(true)
methods increase the probability of invoking finalize()
method but now these two methods have been deprecated. These methods are very dangerous due to lack of thread safety and possible deadlock creation.
Coming back to shutdownHooks, as per oracle documentation
public void addShutdownHook(Thread hook)
Registers a new virtual-machine shutdown hook.
The Java virtual machine shuts down in response to two kinds of events:
- The program exits normally, when the last non-daemon thread exits or when the exit (equivalently, System.exit) method is invoked, or
- The virtual machine is terminated in response to a user interrupt, such as typing ^C, or a system-wide event, such as user logoff or system shutdown.
- When the virtual machine begins its shutdown sequence it will start all registered shutdown hooks in some unspecified order and let them run concurrently. When all the hooks have finished it will then run all uninvoked finalizers if finalization-on-exit has been enabled.
- Finally, the virtual machine will halt. Note that daemon threads will continue to run during the shutdown sequence, as will non-daemon threads if shutdown was initiated by invoking the exit method.
But even oracle documentation quoteed that
Shutdown hooks should also finish their work quickly. When a program invokes exit the expectation is that the virtual machine will promptly shut down and exit.
In rare circumstances the virtual machine may abort, that is, stop running without shutting down cleanly
Considering drawbacks of the both these approaches, you should follow below approach
Do not depend on finalize()
or shutdown hooks
to release critical resources in your application.
use try{} catch{} finally{}
blocks appropriately and release critical resources in finally(}
block. During release of resources in finally{}
block, catch Exception
and Throwable
.
runFinalizersOnExit
. – Chick