繁体   English   中英

找出谁叫jvm shutdown钩子

[英]Finding out who calls jvm shutdown hook

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

我在应用程序中保留了defaultuncaughtexceptionahandler和shutdown挂钩。

我有一些称为出口点的用户,例如,用户单击出口,某些错误情况等。所有用户出口点均具有正确的日志,这些日志后面将带有关闭钩子。

现在,对于我的一位用户,该应用程序会不时退出。 在这里,用户没有呼叫任何用户出口点。 将关闭关机日志记录。 defaultuncaughtexception处理程序没有例外。

我找不到谁调用了system.exit,因此也没有找到shutdown钩子。 我能以某种方式找到所谓的关闭钩子或system.exit()吗? 打印关闭挂钩使我认为这是正确的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信号等)引起的关闭。

如果运行的是OpenJDK / Oracle JDK,则可以注册一个“系统”关闭钩子,该钩子将转储已启动关闭过程的线程:

    sun.misc.SharedSecrets.getJavaLangAccess().registerShutdownHook(7, true,
            () -> {
                System.out.println(Thread.currentThread());
                new Exception("Who called me?").printStackTrace();
            });

即使对于Ctrl+C类的外部事件,这也将起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM