java – shutdown hook和finalizer方法

我只是不明白为什么必须使用Runtime.addShutdownHook.如果你想在jvm退出时做一些清理,那为什么不只是重载守护进程类的finalize方法.使用shutdown hook超过finalize方法的优点是什么?

还有一个不推荐使用的函数runFinalizersOnExit.如果我把它设置为false,我相信finalizer不会运行.这与java保证终结者总是在垃圾回收之前运行.

解决方法

不能保证终结者将永远不会运行.当对象被垃圾回收时,调用finalize().但是当程序运行时,垃圾收集器可能不会收集任何东西.

当jvm正常退出时,运行关闭挂钩.所以即使这不是100%保证,但它是相当接近.只有几个边缘情况下关闭挂钩不运行.

编辑
我查找了没有执行关机挂钩的边缘情况

执行关机挂钩:

>当所有JVM线程完成执行时
>因为调用System.exit()
因为用户打CNTRL-C
>系统级关机或用户注销

关机挂钩不执行:

>如果由于本地代码中的错误导致VM崩溃,则无法保证挂起是否运行.
>如果使用Linux上的-kill命令或Windows上的终止进程终止JVM,则JVM将立即退出

相关文章

应用场景 C端用户提交工单、工单创建完成之后、会发布一条工...
线程类,设置有一个公共资源 package cn.org.chris.concurre...
Java中的数字(带有0前缀和字符串)
在Java 9中使用JLink的目的是什么?
Java Stream API Filter(过滤器)
在Java中找到正数和负数数组元素的数量