Java 关闭钩子与终结器方法
我只是不明白为什么必须使用Runtime.addShutdownHook。如果您想在jvm退出时进行一些清理,为什么不重载守护进程类的finalize方法呢。使用shutdownhook-overfinalize方法的优势是什么Java 关闭钩子与终结器方法,java,multithreading,finalizer,shutdown-hook,Java,Multithreading,Finalizer,Shutdown Hook,我只是不明白为什么必须使用Runtime.addShutdownHook。如果您想在jvm退出时进行一些清理,为什么不重载守护进程类的finalize方法呢。使用shutdownhook-overfinalize方法的优势是什么 还有一个不推荐使用的函数runFinalizersOnExit。如果我将其设置为false,我相信终结器将不会运行。这与java保证终结器总是在垃圾收集之前运行相矛盾。不能保证终结器会一直运行finalize()。但是当程序运行时,垃圾收集器可能不会收集任何东西 相反,
还有一个不推荐使用的函数runFinalizersOnExit。如果我将其设置为false,我相信终结器将不会运行。这与java保证终结器总是在垃圾收集之前运行相矛盾。不能保证终结器会一直运行<当对象被垃圾收集时,调用code>finalize()。但是当程序运行时,垃圾收集器可能不会收集任何东西 相反,关闭挂钩是在jvm正常退出时运行的。因此,即使这也不是100%的保证,但它非常接近。只有少数情况下关闭挂钩不会运行 编辑 我查找了没有执行关闭挂钩的边缘案例 关闭钩子被执行:
- 当所有JVM线程都已完成执行时
- 由于对System.exit()的调用
- 因为用户点击了CNTRL-C
- 系统级关闭或用户注销
- 如果VM由于本机代码中的错误而崩溃,则无法保证钩子是否会运行李>
- 若在Linux上使用-kill命令杀死JVM,或者在windows上终止进程,那个么JVM会立即退出
finalize()
。JVM不保证何时调用此方法finalize()
,而不会再次调用finalizeSystem.runFinalization(true)
和Runtime.getRuntime().runFinalization(true)
方法增加了调用finalization()
方法的概率,但现在这两种方法已被弃用。由于缺乏线程安全性和可能的死锁创建,这些方法非常危险finalize()
或shutdown hook
来释放应用程序中的关键资源try{}catch{}finally{}
块,释放finally(}
块中的关键资源。在释放finally{}
块中的资源时,捕获异常
和可丢弃
如果我没记错的话,只有具有守护进程状态的线程,finalize函数肯定不会运行。您能解释一下,为什么finalize可能不会为正常线程运行。还有,在哪些边缘情况下,关闭挂钩在运行期间不会运行shutdown@SKr如果VM正确退出,则在实际线程结束后可能不会对线程对象进行GC例如,离开。@Darkhogg如果您的意思是突然关闭jvm,那么即使是关闭钩子也不会execute@SKr不,我说的是正常关机。最后一个线程结束->VM退出。没有GC。没有终结器。@SKr更新了关机挂钩运行和未运行时的答案“这与java保证终结器总是在垃圾收集之前运行相矛盾。“…Java保证?没有这样的保证。这种方法是在多核处理器不是标准和并发性不太常见的情况下创建的,但现在…它非常不安全,可能会导致不可逆转的系统损坏。任何人都不应该使用
runFinalizersOnExit
。