【发布时间】:2011-06-02 10:52:00
【问题描述】:
有没有办法确定 jvm 是否正常关闭? shutdown hook只能产生一个线程,有没有办法判断那个时候JVM是正常存在还是异常存在?
【问题讨论】:
有没有办法确定 jvm 是否正常关闭? shutdown hook只能产生一个线程,有没有办法判断那个时候JVM是正常存在还是异常存在?
【问题讨论】:
您可以在启动时写入文件并在正常退出时再次删除它。如果 JVM 已消失但文件仍然存在,则您知道它已崩溃或以其他方式意外退出。
【讨论】:
我记得之前有人问过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() 方法。
【讨论】:
使用命令 $? 检查返回状态
【讨论】:
当JVM正常关闭时,这意味着主线程已经结束。如果 JVM 因其他原因(例如用户按下 Strg+C)而关闭,则主线程仍在运行。因此,您可以在关闭挂钩中存储对主线程的引用,并检查该线程是否仍然存在。当然,这假设主线程通常是应用程序中最后一个运行的线程。如果其中一个线程调用 System.exit(),我不知道情况如何,但您可以轻松找到它。
【讨论】: