亚洲av天堂最新地址钩子函数来不足推行就关闭了

  • 首页
  • 免费观 看成人网站
  • 将粗大挺进邻居人妻
  • 亚洲国产成人AV线
  • 伊人狼人大蕉香AV
  • 行房时间短怎么治
  • 亚洲av天堂最新地址钩子函数来不足推行就关闭了
    发布日期:2022-09-23 05:57    点击次数:190
    饥渴熟女张开腿呻吟亚洲av天堂最新地址

    绪言

    1、基本笼统

    设施的动手很浅易,动手的技能常常会做一些预加载资源的操作。然而有技能关闭的技能,动手的技能预加载的资源并莫得十足计帐干净,因此不错使用钩子函数来完成。

    2、JVM关闭的场景分类

    径直看一张图吧,本图来自博客园的BarryWang,特在此诠释。

    从上头不错看到,JVM关闭主要分为了三类,第一种是宽广的关闭,第二种是相配关闭的情况,第三种是强制关闭的情况。对于前两种口头咱们不错使用钩子函数优雅的关闭,然而强制关闭的技能钩子函数并不起作用。

    有了这些成见,咱们径直使用一个案例进行演示,再进行分析。

    一、代码演示钩子函数

    1、JVM宽广关闭

    径直看代码吧,

    public class Test {  public void start(){   Runtime.getRuntime().addShutdownHook(new Thread(()->      System.out.println("钩子函数被推行,不错在这里关闭资源")   ));  }  public static void main(String[] args) throws Exception{   new Test().start();   System.out.println("主运用设施在推行");  } } //闭幕台输出 //主运用设施在推行 //钩子函数被推行,不错在这里关闭资源 

    看闭幕台打印,不错发现,主运用设施推行完之后就会调用钩子函数,接下来就会厚爱的关闭JVM。

    2、相配关闭

    如故径直看代码演示, 国产这里咱们演示相配关闭的第二种OOM的情况,咱们不错先修复堆的大小为20M,然后在代码中创建一个500M的对象,这么就会OOM。参数是-Xmx20M;

    public class Test {  public void start(){   Runtime.getRuntime().addShutdownHook(new Thread(()->      System.out.println("钩子函数被推行,不错在这里关闭资源")   ));  }  public static void main(String[] args) throws Exception{   new Test().start();   System.out.println("主运用设施在推行");   Runtime.getRuntime().halt(1);   byte[] b = new byte[500*1024*1024];  } } //闭幕台输出 //主运用设施在推行 //钩子函数被推行,不错在这里关闭资源 

    从闭幕台不错看出,钩子函数在相配关闭的技能一经会被调用。

    3、强制关闭

    这里咱们使用Runtime.getRuntime().halt()来演示强势关闭。这个活动和System.exit的分辩是,System.exit会推行钩子函数,然而Runtime.getRuntime().halt()不会。

    public class Test {  public void start(){   Runtime.getRuntime().addShutdownHook(new Thread(()->      System.out.println("钩子函数被推行,欧美性情免费观看不错在这里关闭资源")   ));  }  public static void main(String[] args) throws Exception{   new Test().start();   System.out.println("主运用设施在推行");   Runtime.getRuntime().halt(1);  } } //闭幕台输出 //主运用设施在推行 

    从上头代码的输出不错看出,调用了Runtime.getRuntime().halt(1)就会强制关闭JVM,钩子函数来不足推行就关闭了。而使用System.exit一经会推行。是以一般使用System.exit来关闭JVM。

    4、移除钩子函数

    上头演示了钩子函数的作用,有技能咱们想移除也比拟浅易。

    public class Test {  public static void main(String[] args) throws Exception{   //new Test().start();   Thread willNotRun = new Thread(() ->     System.out.println("Won't run!"));   Runtime.getRuntime().addShutdownHook(willNotRun);   System.out.println("主运用设施在推行");   Runtime.getRuntime().removeShutdownHook(willNotRun);  } } //闭幕台输出 //主运用设施在推行 

    OK,钩子函数的基本操作就写到这,使用起来比拟浅易,不外我之前看过Spring的动手进程,是以又去阿谁动手进程看了一波,发现也使用到了钩子函数。

    二、典型运用场景

    1、Spring使用

    Spring在关闭高下文的技能,不错使用钩子函数来关闭残留的资源。活动是使用ApplicationContext注册一个钩子函数即可。

    ApplicationContext.registerShutdownHook(); //上头的这句代码不错分析进去望望 public void registerShutdownHook() {     if (this.shutdownHook == null) {       this.shutdownHook = new Thread() {         @Override         public void run() {           //Spring宽广关闭           doClose();         }       };       //调用钩子函数关闭残留资源       Runtime.getRuntime().addShutdownHook(this.shutdownHook);     } } 

    从源码不错看出,Spring其实亦然调用了Java的钩子函数进行关闭的。

    2、其他使用

    我在好多博客中也看到了spark和hadoop的关闭,由于我没看过源码,是以这里我说一下论断,对于其他的使用场景,基本上亦然调用了Java的钩子函数来推行的。

    论断

    在关闭JVM的技能,咱们不错封装钩子函数去优雅的关闭线程。不外在使用的技能还需要严防以下几个方面:

    1、钩子函数骨子是个线程

    多个钩子会并发推行,JVM并不保证它们的推行规矩;因此最佳是在一个钩子中推行一系列操作。

    2、钩子中不可再新建钩子

    在关闭钩子中,不可推行注册、移除钩子的操作,不然JVM抛出 IllegalStateException。也不可使用System.exit(),前边提到System.exit()会触发钩子函数的推行,然而Runtime.halt()不错,因为Runtime.halt()不错强制关闭。

    3、钩子里最佳不要有耗时操作

    钩子函数主要用于关闭残留资源,因此不要有一些耗时的操作。

    OK,先写到这。联系的教养活动,并保举几本对于体验、思考的竹帛。但愿对同学们有所启发。

    本文转载自微信公众号「愚公要移山」,不错通过以下二维码柔软。转载本文请磋磨愚公要移猴子众号。