【问题标题】:determine if an application is shutting down normally确定应用程序是否正常关闭
【发布时间】:2011-06-02 10:52:00
【问题描述】:

有没有办法确定 jvm 是否正常关闭? shutdown hook只能产生一个线程,有没有办法判断那个时候JVM是正常存在还是异常存在?

【问题讨论】:

    标签: java jvm shutdown


    【解决方案1】:

    您可以在启动时写入文件并在正常退出时再次删除它。如果 JVM 已消失但文件仍然存在,则您知道它已崩溃或以其他方式意外退出。

    【讨论】:

    • +1 但是...如果您尝试正确地做到这一点,就会有很多 的陷阱。例如,您知道在哪里以及如何知道文件的存储位置?例如,在 OS X 上,tmpdir 属性返回的位置可以从一次运行到下一次更改。然后,您需要一种方法来了解文件的保存位置(例如使用 Preferences API)。此外,这并不是因为您有权写入某些临时文件,因此您在下次运行时会获得相同的权利。如果运行两个实例,等等。它可以工作,但它比你的答案听起来要复杂得多
    • @SyntaxT3rr0r:是的,你是对的,尽管复杂性取决于需要什么样的应用程序。对于服务器应用程序,您通常需要一些定义明确的目录,您可以在其中写入文件。对于桌面应用程序,了解意外关机后会发生什么以提出更详细的解决方案会很有帮助。
    【解决方案2】:

    我记得之前有人问过similar question。一种可能的做法是使用SignalHandler

    您可以阅读full article here。它似乎与 IBM JVM 有关,但我认为它同样适用于 Java Hotspot。

    Java 的一个鲜为人知的特性是 应用程序安装的能力 它自己的信号处理程序,即 通过 sun.misc.Signal 支持 班级。但是,使用时要小心 sun.misc 包中的类 因为它包含无证 支持可能改变的类 Java 版本之间。你可以 为任何信号安装 Java 处理程序 JVM不使用它。这些 信号处理程序类似于本机 处理程序,因为它们在何时被调用 引发了本机系统信号,但是 它们将始终作为单独的运行 Java 线程。本质上,当一个 引发 Java 的信号 信号处理程序可用,JVM 的 “信号调度线程”被唤醒 并获知信号。信号 调度程序线程然后调用 Java 创建和启动新的方法 已安装 Java 信号的线程 处理程序。编写 Java 信号 处理程序,定义一个类 实现 sun.misc.SignalHandler 接口并通过以下方式注册处理程序 使用 sun.misc.Signal.handle() 方法。

    【讨论】:

      【解决方案3】:

      使用命令 $? 检查返回状态

      【讨论】:

        【解决方案4】:

        当JVM正常关闭时,这意味着主线程已经结束。如果 JVM 因其他原因(例如用户按下 Strg+C)而关闭,则主线程仍在运行。因此,您可以在关闭挂钩中存储对主线程的引用,并检查该线程是否仍然存在。当然,这假设主线程通常是应用程序中最后一个运行的线程。如果其中一个线程调用 System.exit(),我不知道情况如何,但您可以轻松找到它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-02-04
          • 1970-01-01
          • 2013-07-16
          • 1970-01-01
          • 2014-07-06
          • 1970-01-01
          • 1970-01-01
          • 2011-11-15
          相关资源
          最近更新 更多