java - 找出谁调用了 jvm shutdown hook

标签 java jvm shutdown-hook

我有基于 Java 的 Windows 桌面应用程序。

我在我的应用程序中保留了defaultuncaughtexceptionahandler 和shutdown hook。

我有一些称为退出点的用户,例如,用户单击退出,一些错误条件等。所有用户退出点都有正确的日志,后面将是登录关闭 Hook 。

现在,对于我的一个用户来说,应用程序时不时地退出。这里用户没有调用任何用户退出点。打印关闭 Hook 日志。 defaultuncaughtException 处理程序没有异常。

我无法找到谁调用了 system.exit 以及 shutdown hook 。 我能以某种方式找到调用 shutdown hook 或 system.exit () 的内容吗? 打印关闭 Hook 让我认为这是一次正确的 jvm 关闭而不是突然的关闭。

最诚挚的问候, 索拉夫

最佳答案

如果您怀疑有人显式调用 System.exit(…) 或类似函数,您可以使用 SecurityManager 拦截它:

System.setSecurityManager(new SecurityManager() {
    @Override
    public void checkExit(int status) {
        new Exception("exit attempt with return code "+status).printStackTrace();
    }
    // note that all dedicated check... methods delegate to the two below,
    // so overriding these is sufficient to enable all other actions
    @Override
    public void checkPermission(Permission perm, Object context) { }

    @Override
    public void checkPermission(Permission perm) { }
});

但是,这不会拦截由外部事件(例如 TERM 信号等)引起的关闭。

关于java - 找出谁调用了 jvm shutdown hook,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42091522/

相关文章:

java - 我的抽屉导航所选项目未完全覆盖整个菜单区域

java - OpenJDK 11 无法解析 javax.xml.* 属性

java - JVM 中 `boolean` 类型的用途是什么?

java - 在使用海量数据的同时使用 Hashmaps 和 ArrayLists 有多糟糕?

java - Apache JMeter 4.0 中的 JVM 错误

java - 如何调用在另一个线程中运行的程序的关闭钩子(Hook)

java - android 小部件 SearchView OnQueryTextListener

java - 监听客户端套接字(Android)

java - 在java中运行关闭 Hook 的问题

java - 如何实现执行结束自动关闭的线程池?