有什么办法可以在jvm进程被杀死时执行一些java代码吗?

Chr*_*ris 6 java jvm

我们希望在JVM手动终止时退出之前执行一些java代码或shell代码.我们的应用程序没有在容器中运行.我们需要使用Java代码本身或某些命令行工具自动监视它.

bob*_*bah 12

您可以使用Runtime.getRuntime().addShutdownHook()添加关闭挂钩.一旦JVM进程终止,这样的关闭钩子就由JVM运行.但请注意,并非总是如此.JVM可能会在有机会触发其关闭挂钩之前被杀死.这在javadoc中提到:

在极少数情况下,虚拟机可能会中止,即停止运行而不会干净地关闭.当虚拟机在外部终止时会发生这种情况,例如Unix上的SIGKILL信号或Microsoft Windows上的TerminateProcess调用.如果本机方法因例如破坏内部数据结构或尝试访问不存在的内存而出错,则虚拟机也可能中止.如果虚拟机中止,则无法保证是否将运行任何关闭挂钩.

您可以按如下方式使用关闭挂钩:

Runtime.getRuntime().addShutdownHook(
  new Thread("app-shutdown-hook") {
    @Override 
    public void run() { 
      System.out.println("bye"); 
    }
});
Run Code Online (Sandbox Code Playgroud)

一旦不再需要,您也可以并且也应该取消注销关闭钩子.否则,JVM永远不会垃圾收集钩子.

  • @raphw:Ctrl-C默认触发SIGINT,*不是SIGKILL. (2认同)