shutdown hook vs finalizer方法

 tingel34 发布于 2023-02-07 16:24

我只是不明白为什么必须使用Runtime.addShutdownHook.如果你想在jvm退出时进行一些清理,为什么不重载守护进程类的finalize方法.使用shutdown hook而不是finalize方法有什么好处.

还有一个不推荐使用的函数runFinalizersOnExit.如果我将其设置为false,我相信终结器将无法运行.这与java保证终结器总是在垃圾收集之前运行相矛盾.

1 个回答
  • 没有一个终结将保证永远运行.finalize()在对象被垃圾收集时调用.但是,当程序运行时,垃圾收集器可能无法收集任何内容.

    当jvm正常退出时,运行对比关闭钩子.所以,即使这不是100%保证,但它非常接近.只有少数边缘情况不会运行关闭挂钩.

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

    关闭挂钩IS执行:

    当所有JVM线程都已完成执行时

    因为调用System.exit()

    因为用户点击了CNTRL-C

    系统级别关闭或用户注销

    关闭挂钩IS NOT执行:

    如果VM由于本机代码中的错误而崩溃,则无法保证是否将运行挂钩.

    如果在Linux上使用-kill命令或在Windows上使用Terminate Process终止JVM,则JVM会立即退出

    2023-02-07 16:26 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有