确定应用程序是否正常关闭

时间:2011-06-02 10:52:00

标签: java jvm shutdown

有没有办法确定jvm是否正常关闭? Shutdown hook只能生成一个线程,有没有办法确定JVM当时是正常还是异常存在?

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

使用命令$?

检查返回状态

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我记得很久以前被问到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信号   handler,定义一个类   实现sun.misc.SignalHandler   接口并注册处理程序   使用sun.misc.Signal.handle()   方法