On 01/27/2015 09:55 PM, Martin Buchholz wrote:
If you want to ensure something is run before VM exit, add a shutdown
hook.
If you really want to run all the finalizers, you can always run a
variant of GcFinalization in your shutdown hook, although as always
running during shutdown increases the risk greatly.
What do you mean by "GcFinalization" ?
When shutdown hooks run, there can be objects with finalize methods that
are still reachable from GC roots, so they are not pending finalization
yet. Invoking System.gc() and System.runFinalization() would not run
finalizers for them. runFinalizersOnExit on the other hand, run the
finalizers for all objects with finalize methods regardles of their
"pending" status. This is dangerous of course. Even more than normal
finalization. But there's no public API for that after
runFinalizersOnExit is removed.
Practically, I think this only potentially affects environments where VM
is embedded in a process that keeps running when a particular instance
of VM already exits.
Peter
On Tue, Jan 27, 2015 at 6:48 AM, Peter Levart <peter.lev...@gmail.com
<mailto:peter.lev...@gmail.com>> wrote:
On 01/27/2015 01:54 PM, Peter Levart wrote:
A poor-man's escape hatch is a shutdown hook that calls
System.runFinalization(). Which might interfere with other
shutdown hooks that run concurrently (runFinalizersOnExit runs
finalizers after all shutdown hooks are finished).
Not really. This only runs finalizers for Objects pending
finalization, while runFinalizersOnExit runs it for all Objects
with finalize() methods that have not been invoked yet. A big
difference. So there's no alternative if this method is removed.
Peter