[英]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.