RunTime.getRunTime().addShutdownHook

在jvm中增长一个关闭的钩子,当jvm关闭的时候,会执行系统中已经设置的全部经过方法addShutdownHook添加的钩子,当系统执行完这些钩子后,jvm才会关闭。因此这些钩子能够在jvm关闭的时候进行内存清理、对象销毁等操做。并发

在了解关闭钩子以前,首先介绍一下Runtime.jvm

  经过Runtime实例,使得应用程序和其运行环境相链接。Runtime是在应用启动期间自动创建,应用程序不可以建立Runtime,可是咱们能够经过Runtime.getRuntime()来得到当前应用的Runtime对象引用,经过该引用咱们能够得到当前运行环境的相关信息,好比空闲内存、最大内存以及为当前虚拟机添加关闭钩子(addShutdownHook()),执行指定命令(exec())等等。ide

那么,什么叫作jvm关闭呢。继续google,总结一下以下:google

jvm的关闭方式有三种:操作系统

正常关闭:当最后一个非守护线程结束或者调用了System.exit或者经过其余特定平台的方法关闭(发送SIGINT,SIGTERM信号等) 强制关闭:经过调用Runtime.halt方法或者是在操做系统中直接kill(发送SIGKILL信号)掉JVM进程 异常关闭:运行中遇到RuntimeException异常等。线程

关闭钩子(shutdown hooks)日志

  在某些状况下,咱们须要在JVM关闭时作些扫尾的工做,好比删除临时文件、中止日志服务以及内存数据写到磁盘等,为此JVM提供了关闭钩子(shutdown hooks)来作这些事情。另外特别注意的是:若是JVM因异常关闭,那么子线程(Hook本质上也是子线程)将不会中止。但在JVM被强行关闭时,这些线程都会被强行结束。code

  关闭钩子本质是一个线程(也称为Hook线程),用来监听jvm的关闭。经过Runtime的addShutdownHook能够向JVM注册一个关闭钩子。Hook线程在JVM正常关闭才会执行,强制关闭时不会执行。对象

  JVM中注册的多个关闭钩子是并发执行的,没法保证执行顺序,当全部Hook线程执行完毕,runFinalizersOnExit为true,JVM会先运行终结器,而后中止。进程

  注意事项:1.hook线程会延迟JVM的关闭时间,因此尽量减小执行时间。

       2.关闭钩子中不要调用system.exit(),会卡主JVM的关闭过程。可是能够调用Runtime.halt()

       3.不能再钩子中进行钩子的添加和删除,会抛IllegalStateException

       4.在system.exit()后添加的钩子无效,由于此时jvm已经关闭了。

5.当JVM收到SIGTERM命令(好比操做系统在关闭时)后,若是钩子线程在必定时间没有完成,那么Hook线程可能在执行过程当中被终止。

       6.Hook线程也会抛错,若未捕获,则钩子的执行序列会被中止。

package test;  
public class TestShutDownHook {  
    public TestShutDownHook() {  
        doShutDownWork();  
    }  
    private void doShutDownWork() {  
        Runtime run=Runtime.getRuntime();//当前 Java 应用程序相关的运行时对象。  
        run.addShutdownHook(new Thread(){ //注册新的虚拟机来关闭钩子  
            @Override  
            public void run() {  
                //程序结束时进行的操做  
                System.out.println("程序结束调用");  
            }  
        });  
    }  
    public static void main(String[] args) {  
        new TestShutDownHook();  
        for (int i = 0; i < 1000; i++) { // 在这里增添您须要处理代码 }  
            System.out.println(i);  
        }  
    }  
}
本站公众号
   欢迎关注本站公众号,获取更多信息