【问题标题】:When Shutdown Hooks Break Bad当关闭挂钩坏了
【发布时间】:2011-11-17 17:33:05
【问题描述】:

如果我像这样向我的 Java 程序的运行时添加 shutdown hook

public class MyShutdownHook implements Runnable
{
    @Override
    public void run()
    {
        // Stuff I want executed anytime
        // the program, Java, or the OS exits normally,
        // crashes, or terminates unexpectedly for any reason.
    }
}

// The in another method...
Runtime.getRuntime().addShutdownHook(new MyShutdownHook());

...那么有没有曾经在程序/Java/OS 正常退出、崩溃或意外终止时不会执行run() 方法的情况?如果是这样,什么情况下可以绕过Runtime 的关闭挂钩,为什么?

【问题讨论】:

  • 永远不要忽视对您的计算机进行核攻击的可能性。
  • 除了 javadoc 对它的工作原理的描述之外,您还想了解更多信息吗?
  • @Mark Peters: : ) 好笑的玩笑...但不要忘记 SIGKILL 几乎 一种原子武器; ) 在 Linux 和 OS X 上(这两个名字只是开发人员常用的两个 Unx-like)*kill -9保证 立即终止进程并释放它的资源,毫无疑问。没有ShutDownHook。没什么。现在我同意:Java 进程不会看到 kill -9 和核攻击之间有任何区别; )

标签: java runtime shutdown


【解决方案1】:
  • 如果进程被杀死,将不会执行关闭挂钩。

  • 如果进程崩溃,将不会执行关闭挂钩。

  • 如果您有一个 Windows 服务并且关闭挂钩需要很长时间才能执行,它将被终止。

【讨论】:

  • 记住,只有被 SIGKILL 杀死,SIGTERM 和类似的仍然运行关闭钩子
  • 如果进程收到 SIGTERM 信号(UNIX 中的常规“kill”命令),则关闭挂钩将运行。只有发送 SIGKILL (kill -9) 才会运行失败。
  • 如果你想学究气,如果我kill -11 <pid> Java 进程它也不会在那里运行关闭挂钩。虽然我猜你可能会说这属于“崩溃”项目符号。
【解决方案2】:

如果您将插头从计算机背面拔出,则关闭挂钩将不会运行。其他情况包括:

  • 在 POSIX 操作系统上使用 SIGKILL (-9) 杀死进程。
  • 同样,如果您选择终止 Windows 下的“无响应”进程,则关闭挂钩可能无法完成。

【讨论】:

    【解决方案3】:

    它们仅在进程“正常关闭”时运行。如果进程被操作系统强行终止,或者由于资源问题(例如内存不足)而崩溃,则不会调用关闭挂钩。

    【讨论】:

      【解决方案4】:

      当您执行Runtime.getRuntime().halt() JVM 或操作系统终止进程而不允许其运行任何清理时,以及当您让 eclipse 终止程序时(在 eclipse 下运行时)

      【讨论】:

        【解决方案5】:

        只要 JVM 可以正常退出,就会运行关闭挂钩。如果出现以下情况,则不会运行:

        • JVM 崩溃。 (取决于它崩溃的方式/时间,钩子可能仍然运行,但不能保证)
        • JVM 收到 SIGKILL 或类似情况,并立即被操作系统停止

        【讨论】:

          猜你喜欢
          • 2011-07-20
          • 1970-01-01
          • 2015-09-22
          • 2011-02-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多