• java的关闭钩子(Shutdown Hook)


    Runtime.getRuntime().addShutdownHook(shutdownHook);

       这个方法的含义说明:
           这个方法的意思就是在jvm中增加一个关闭的钩子,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添加的钩子,当系统执行完这些钩子后,jvm才会关闭。所以这些钩子可以在jvm关闭的时候进行内存清理、对象销毁等操作。
     

    用途

    1应用程序正常退出,在退出时执行特定的业务逻辑,或者关闭资源等操作。

     

    2虚拟机非正常退出,比如用户按下ctrl+c、OutofMemory宕机、操作系统关闭等。在退出时执行必要的挽救措施。

     
    示例:

    public class JVMHook {

     public static void start(){
      System.out.println("The JVM is started");
      Runtime.getRuntime().addShutdownHook(new Thread(){
       public void run(){
        try{
         //do something
         System.out.println("The JVM Hook is execute");
        }catch (Exception e) {
         e.printStackTrace();
        }
       }
      });
     }
     
     public static void main(String[] args) {
      start();
      
      System.out.println("The Application is doing something");
      
      
      
      try {
       Thread.sleep(3000);
      } catch (InterruptedException e) {
       e.printStackTrace();
      }
     }
    }

    输出结果:

    The JVM is started
    The Application is doing something
    The JVM Hook is execute

    最后一条是三秒后JVM关闭时候输出的。

    针对用途第二点给的例子:
    package com.java.seven;
    public class JVMHook {
     public static void start(){
      System.out.println("The JVM is started");
      Runtime.getRuntime().addShutdownHook(new Thread(){
       public void run(){
        try{
         //do something
         System.out.println("The JVM Hook is execute");
        }catch (Exception e) {
         e.printStackTrace();
        }
       }
      });
     }
     
     public static void main(String[] args) {
      start();
      
      System.out.println("The Application is doing something");
      
      byte[] b = new byte[500*1024*1024];
      
      System.out.println("The Application continues to do something");
      
      try {
       Thread.sleep(3000);
      } catch (InterruptedException e) {
       e.printStackTrace();
      }
     }
    }

    输出结果:

    The JVM is started
    The Application is doing something
    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
     at com.java.seven.JVMHook.main(JVMHook.java:24)
    The JVM Hook is execute

    在OutOfMemoryError的时候可以做一些补救措施。

    建议:同一个JVM最好只使用一个关闭钩子,而不是每个服务都使用一个不同的关闭钩子,使用多个关闭钩子可能会出现当前这个钩子所要依赖的服务可能已经被另外一个关闭钩子关闭了。为了避免这种情况,建议关闭操作在单个线程中串行执行,从而避免了再关闭操作之间出现竞态条件或者死锁等问题。

     

  • 相关阅读:
    Smart Client Architecture and Design Guide
    Duwamish密码分析篇, Part 3
    庆贺发文100篇
    .Net Distributed Application Design Guide
    New Introduction to ASP.NET 2.0 Web Parts Framework
    SPS toplevel Site Collection Administrators and Owners
    来自Ingo Rammer先生的Email关于《Advanced .Net Remoting》
    The newsletter published by Ingo Rammer
    深度探索.Net Remoting基础架构
    信道、接收器、接收链和信道接受提供程序
  • 原文地址:https://www.cnblogs.com/langtianya/p/4300282.html
Copyright © 2020-2023  润新知