从ShutdownHook中找出程序退出的原因

4
如果我有一个Java程序,它可能因为以下各种原因退出:
因为设置为“关闭即退出”的主窗口已关闭;
因为代码中有一些System.exit(0);
因为没有窗口了(也没有设置为“关闭即退出”的窗口),但仍有几个线程在运行,然后在某个时刻只有守护线程在运行,因此程序退出。
而且我已经安装了一个关机钩子(运行良好)。
从我的关机钩子中,有没有办法知道是什么原因导致Java程序退出?
(请注意,我不是在问在代码库中分散使用System.exit(...)是否是一个好主意,这不是这个问题的内容)
基本上,我想知道是否必须拦截每个可能的JVM退出点并在那里添加信息,还是已经有一种方法可以做到这一点。
2个回答

4

您可以添加一个SecurityManager,该SecurityManager将在系统退出时被调用(以确定是否允许退出)。您可以保存此处的调用位置以供以后使用,或在SecurityManager中处理它。


“你可以将这个被调用的位置保存下来以备后用…” 的意思是什么?使用 SecurityManager,我能否获取例如 System.exit 调用的确切类/行号? - Cedric Martin
2
你可以使用Thread.currentThread().getStackTrace()来获取堆栈跟踪。当执行安全敏感操作时,SecurityManager会被调用(否则它只是一个类/对象)。 - Peter Lawrey
在您的安全管理器内,您可以构造一个 Throwable,然后使用 printStackTrace()getStackTrace() 从中检索堆栈跟踪。 - John Haager

-1

当JVM关闭时,您的关闭挂钩将在单独的线程中运行可运行逻辑。您不能做更多的事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接