java的关闭钩子(Shutdown Hook)
Runtime.getRuntime().addShutdownHook(shutdownHook);
这个方法的含义说明:
这个方法的意思就是在jvm中增加一个关闭的钩子,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添加的钩子,当系统执行完这些钩子后,jvm才会关闭。所以这些钩子可以在jvm关闭的时候进行内存清理、对象销毁等操作。
用途
1应用程序正常退出,在退出时执行特定的业务逻辑,或者关闭资源等操作。
2虚拟机非正常退出,比如用户按下ctrl+c、OutofMemory宕机、操作系统关闭等。在退出时执行必要的挽救措施。
示例:
package com.ebways.mq.test.hook; /** * JVM钩子 * Created by gmq on 2016/10/13 0013. */ public class JVMHook { public static void main(String[] args) { start(); // ==============================1: start========================== // 1、应用程序正常退出,在退出时执行特定的业务逻辑,或者关闭资源等操作。 // System.err.println("The Application is doing something"); // try { // Thread.sleep(3000); // } catch (InterruptedException e) { // e.printStackTrace(); // } // ==============================1: end========================== // ==============================2: start========================== // 2、虚拟机非正常退出,比如用户按下ctrl+c、OutofMemory宕机、操作系统关闭等。在退出时执行必要的挽救措施。 System.err.println("The Application is doing something"); byte[] bytes = new byte[500 * 1024 * 1024]; throwException(); System.err.println("The Application continues to do something"); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } // ==============================2: end========================== } private static void throwException() { throw new OutOfMemoryError("ASDF"); } public static void start() { System.err.println("The JVM is started"); Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { try { // do something System.err.println("The JVM Hook is execute!"); } catch (Exception e) { e.printStackTrace(); } } }); } }
控制台信息:
1、的情况
The JVM is started The Application is doing something The JVM Hook is execute! Process finished with exit code 0
最后一条是三秒后JVM关闭时候输出的。
2:的情况
The JVM is started The Application is doing something Exception in thread "main" java.lang.OutOfMemoryError: ASDF at com.ebways.mq.test.hook.JVMHook.throwException(JVMHook.java:41) at com.ebways.mq.test.hook.JVMHook.main(JVMHook.java:28) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) The JVM Hook is execute!
在OutOfMemoryError的时候可以做一些补救措施。
建议:同一个JVM最好只使用一个关闭钩子,而不是每个服务都使用一个不同的关闭钩子,使用多个关闭钩子可能会出现当前这个钩子所要依赖的服务可能已经被另外一个关闭钩子关闭了。为了避免这种情况,建议关闭操作在单个线程中串行执行,从而避免了再关闭操作之间出现竞态条件或者死锁等问题。
弱水_穿云天
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
2015-10-13 bootstrap的select2校验及不影响原来的格式