有没有办法确定jvm是否正常关闭?关闭钩子只能产生一个线程,有没有一种方法可以确定当时JVM是否正常或异常存在?确定应用程序是否正常关闭
回答
我记得前面提到的similar question。一种可能的行动方式是使用SignalHandler。您可以阅读full article here。它似乎与IBM JVM有关,但我认为它对于Java Hotspot同样有效。
的Java的一个鲜为人知的功能是安装 自己的信号处理程序,这是 通过sun.misc.Signal 类支持的 能力的应用程序。但是,在使用sun.misc数据包 中的 类时请小心,因为它包含可能在Java发行版之间更改 的未记录的 支持类。您可以为 安装JVM未使用的任何信号 的Java处理程序。这些 信号处理程序类似于本机 处理程序,因为它们在 引发本机系统信号时调用,但它们将始终作为单独的 Java线程运行。本质上,当引发信号处理器可用的 信号时,JVM的 “信号分配器线程”被唤醒 并通知信号。分派器线程然后调用Java 方法来为安装的Java信号处理器创建并启动新的 线程。要编写处理器的Java信号 ,请定义一个类,该类使用sun.misc.Signal.handle() 方法实现sun.misc.SignalHandler接口并通过 注册处理程序。
使用命令$?检查返回sttaus
您可以在启动时编写文件并在优雅退出时再次删除文件。如果JVM消失了,但文件仍然存在,那么您就知道它已经崩溃或以非预期的方式退出。
当JVM正常关闭时,这意味着主线程已经结束。如果JVM正在关闭某些其他重新设置(例如,用户按下了Strg + C),则主线程仍在运行。因此,您可以在关闭钩子中存储对主线程的引用,并检查该线程是否仍然存在。当然,这假定主线程通常是应用程序中最后一个正在运行的线程。如果其中一个线程称为System.exit(),我不知道情况如何,但是您可以轻松找到它。
- 1. 确定UIViewController是否因应用程序退出而关闭?
- 2. 如何确定Android应用程序是否强制关闭?
- 3. 正常关闭应用程序
- 4. WPF应用程序未正确关闭
- 5. 正确关闭Java Web应用程序
- 6. 确定关机正在关闭我的应用程序
- 7. 确定应用程序如何关闭
- 8. 应用程序错误。应用程序无法正确启动(0x000007b)。单击确定关闭应用程序
- 9. 如何关闭应用程序是否关闭
- 10. 应用程序关闭时SqlConnection是否自动关闭?
- 11. 如何检查应用程序是否正在关闭android
- 12. 如何确定应用程序是否是Web应用程序
- 13. 如何正确关闭使用线程的Tkinter应用程序
- 14. 应用程序关闭异常
- 15. 线程未正确完成,阻止应用程序关闭
- 16. Java:nu.xom.Builder是否能正确关闭文件?
- 17. 我是否正确关闭此功能?
- 18. 如何确定应用程序是否正在使用GPU
- 19. 如何使用XE5正确关闭Android应用程序?
- 20. 如何在关闭Windows控制台时正常关闭Java应用程序?
- 21. 应用程序无法正确启动(0xC0000056)。点击确定关闭应用程序
- 22. 应用程序正在关闭
- 23. 应用程序正在关闭(Admob)?
- 24. 窗口在Win32应用程序将无法正常关闭
- 25. Windows窗体应用程序无法正常关闭
- 26. 如何正常关闭Spring Boot应用程序?
- 27. Android应用程序正常关闭但不会再次打开
- 28. 打印后正常关闭应用程序断言错误
- 29. stop tomcat web应用程序正常关闭所有servlet连接
- 30. 如何正常关闭弹簧引导应用程序
+1但是......如果您尝试正确地做到这一点,那么有很多难点。例如,您在哪里以及如何知道在哪里存储文件?例如,在OS X上,由* tmpdir *属性返回的位置可以**从一次运行改变到另一次运行。然后您需要知道文件保存位置的方法(比如使用Preferences API)。另外,这并不是因为您有权写入一些临时文件,您将在下一次运行中获得相同的权利。如果两个实例运行,等等。它可以工作,但它比你的答案听起来更像是复杂得多**。 – SyntaxT3rr0r 2011-06-02 11:05:13
@ SyntaxT3rr0r:是的,你说得对,虽然复杂程度取决于需要什么类型的应用程序。对于服务器应用程序,您通常需要一些定义良好的目录,您可以在其中编写文件。对于桌面应用程序,了解由于意外关机而导致应该发生什么以提供更详细的解决方案会很有帮助。 – x4u 2011-06-02 11:55:50