我只是不明白为什么必须使用Runtime.addShutdownHook.如果你想在jvm退出时进行一些清理,为什么不重载守护进程类的finalize方法.使用shutdown hook而不是finalize方法有什么好处.
还有一个不推荐使用的函数runFinalizersOnExit.如果我将其设置为false,我相信终结器将无法运行.这与java保证终结器总是在垃圾收集之前运行相矛盾.
没有一个终结将保证永远运行.finalize()
在对象被垃圾收集时调用.但是,当程序运行时,垃圾收集器可能无法收集任何内容.
当jvm正常退出时,运行对比关闭钩子.所以,即使这不是100%保证,但它非常接近.只有少数边缘情况不会运行关闭挂钩.
编辑 我查找了没有执行关闭挂钩的边缘情况
关闭挂钩IS执行:
当所有JVM线程都已完成执行时
因为调用System.exit()
因为用户点击了CNTRL-C
系统级别关闭或用户注销
关闭挂钩IS NOT执行:
如果VM由于本机代码中的错误而崩溃,则无法保证是否将运行挂钩.
如果在Linux上使用-kill命令或在Windows上使用Terminate Process终止JVM,则JVM会立即退出