`

shutdown hook

 
阅读更多

转载自:http://www.cnblogs.com/zhuawang/p/4523503.html

 

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

分享到:
评论

相关推荐

    JAVA虚拟机关闭钩子(Shutdown Hook).docx

    JAVA虚拟机关闭钩子(Shutdown Hook).docx

    解析Runtime中shutdown hook的使用详解

    本文将深入解析`shutdown hook`的使用,以及它在不同场景下的应用。 首先,`shutdown hook`是一种特殊类型的线程,它们在JVM启动时注册,并在JVM准备退出之前被唤醒执行。通常,这些钩子用于进行必要的资源清理,...

    JVM问题诊断常用命令

    ### JVM问题诊断常用命令详解 在Java开发与运维过程中,针对JVM(Java虚拟机)进行性能调优、故障排查是非常重要的环节。本文将详细介绍三种常用的JVM问题诊断工具:`jinfo`、`jmap` 和 `jstack` 的功能、用法以及...

    java 程序的退出的资源

    总结一下,Java程序的退出涉及到正常和异常两种方式,使用`System.exit()`、异常处理、`Shutdown Hook`、线程管理和`finally`块是其核心知识点。理解和掌握这些内容,能帮助开发者编写更加健壮、易于维护的程序。

    利用hibernate+spring配置proxool连接池连接Access数据库

    0.9.1后的jar包,修改后可以完全支持spring配置,并添加了charSet配置属性,用于配置数据库链接的设置默认字符集,并且解决了proxool数据库连接池报如下错误的问题:ERROR [Shutdown Hook] (ProxyConnection.java:...

    kinesis-shutdown-test:测试运动学关机钩

    Test for Kinesis Stream shutdown hook 我线上的疑问: 我的Consumers程序使用 KCL 方式读取并处理流中数据, RecordProcessor 实现了 IRecordProcessor接口,其中 RecordProcessor.shutdown 方法中调用 checkpoint...

    JAVA并发编程实践-线程的关闭与取消-学习笔记

    15. **关闭钩子(Shutdown Hook)**:通过`Runtime.getRuntime().addShutdownHook(Thread hook)`注册自定义的关闭钩子,这些钩子在JVM关闭时执行,用于清理资源。 16. **精灵线程(Daemon Thread)**:精灵线程是不...

    How Tomcat Works: A Guide to Developing Your Own Java Servlet Container

    16.2 tomcat中的shutdown hook 131 第17章 启动tomcat 133 17.1 概述 133 17.2 Catalina类 133 17.2.1 start方法 134 17.2.2 stop方法 135 17.2.3 启动Digester 135 17.2.4 关闭Digester 135 17.3 Bootstrap类 136 ...

    XueTr专用版 Hook 过保

    4.CreateProcess、CreateThread、LoadImage、CmpCallback、BugCheckCallback、Shutdown、Lego等Notify Routine信息查看,并支持对这些Notify Routine的删除 5.端口信息查看,目前不支持2000系统 6.查看消息钩子 7....

    blog:日常工作中使用的技术沉淀+学习记录

    介绍 此项目是利用业余时间,对一些技术知识点进行整理,用来记录个人学习笔记。这个项目和 项目的不同在于 是用来动手实践,对于一些技术的实际搭建和造轮子的项目,正...Java虚拟机关闭钩子(Shutdown hook) 公众号

    通过JDK源码分析关闭钩子详解

    为了应对这种情况,Java提供了一个优雅的解决方案——Shutdown Hook。Java虚拟机(JVM)在接收到退出指令时,会尝试执行所有注册的关闭钩子,这些钩子通常是实现`Runnable`接口的线程对象。 **关闭钩子的生成步骤**...

    java多线程源码-ExecuteFramework:java多线程框架核心源码重写

    6. ShutdownHook:为了优雅地关闭线程池,通常会注册一个JVM关闭钩子(Shutdown Hook),在程序退出前,线程池能够完成正在执行的任务并清理资源。 通过研究ExecuteFramework-master源码,我们可以学习到如何设计和...

    Java利用WatchService监听文件变化示例

    最后,为了确保在Java虚拟机关闭的时候能够释放资源并关闭WatchService,应该在程序中增加一个关闭钩子(shutdown hook),确保在JVM关闭的时候能够执行资源释放的相关操作,特别是关闭WatchService。 下面是一个...

    fastify-graceful-shutdown:正常关机即可固定

    默认情况下,当触发SIGINT或SIGTERM时,将调用fastify close hook。 安装 npm install --save fastify-graceful-shutdown 注册插件 fastify . register ( require ( 'fastify-graceful-shutdown' ) ) 用法 fastify ...

    graceful-shutdown-spring-boot:使用Spring Boot正常关闭(演示)

    在IT行业中,优雅停机(Graceful Shutdown)是一项重要的实践,尤其在分布式系统和容器化环境中,例如Docker Swarm或Kubernetes。优雅停机确保在服务停止或更新时,正在处理的请求能够得到完整处理,避免数据丢失和...

    shutdown-app

    可以使用`Runtime.getRuntime().addShutdownHook(Thread hook)`来添加一个钩子。 5. **Spring Boot应用关闭**: - 如果"shutdown-app"是在Spring Boot环境下,那么可能涉及到`@PreDestroy`注解,它标记在方法上,...

    window内核监控工具源代码

    PsSetCreateProcessNotifyRoutine CmRegisterCallback这几个,至于那个什么shutdown回调不知道是啥玩意,就没搞了,有知道的顺便告诉我下撒,谢谢 九:文件系统fat和ntfs的分发函数检测 直接反汇编fat和ntfs的...

    优秀的ARK工具-XueTr

    Shutdown、Lego等Notify Routine信息查看,并支持对这些Notify Routine的删除 5.端口信息查看,目前不支持2000系统 6.查看消息钩子 7.内核模块的iat、eat、inline hook、patches检测和恢复 8.磁盘、卷、键盘、网络层...

    支持windows 7 的XueTr

    4.CreateProcess、CreateThread、LoadImage、CmpCallback、BugCheckCallback、Shutdown、Lego等Notify Routine信息查看,并支持对这些Notify Routine的删除 5.端口信息查看,目前不支持2000系统 6.查看消息钩子 7....

Global site tag (gtag.js) - Google Analytics