java虚拟机钩子关闭函数addShutdownHook的操作
作者:lijie_cq
这篇文章主要介绍了java虚拟机钩子关闭函数addShutdownHook的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
当jvm虚拟机被关闭的时候,可能我们需要做一些处理,比如对连接的关闭,或者对一些必要信息的存储等等操作,这里就可以借助于虚拟机提供的钩子函数,当jvm虚拟机关闭之前会去调用addShutdownHook注册的线程钩子。
这里做一个小实验,项目结构如下:
1.自定义的ApplicationContext的上下文
package cn.lijie; public class ApplicationContext { private static ApplicationContext application; private void init() { application = this; Runtime.getRuntime().addShutdownHook(new MyShutdownHook()); } public void close() { System.out.println("钩子函数关闭连接操作"); } public static ApplicationContext getApplication() { return application; } }
2.定义一个钩子线程MyShutdownHook
package cn.lijie; public class MyShutdownHook extends Thread { public void run() { System.out.println("钩子函数调用,准备关闭连接"); ApplicationContext.getApplication().close(); System.out.println("钩子函数调用,连接已经关闭"); } }
3.spring容器的启动main
package cn.lijie; public class ApplicationContext { private static ApplicationContext application; private void init() { application = this; Runtime.getRuntime().addShutdownHook(new MyShutdownHook()); } public void close() { System.out.println("钩子函数关闭连接操作"); } public static ApplicationContext getApplication() { return application; } }
4.application.xml
<bean name="application" class="cn.lijie.ApplicationContext" init-method="init" />
当执行main方法的时候创建spring容器,然后关闭,届时就会执行之前注册的钩子线程。
打印结果如下:
补充:JAVA虚拟机关闭钩子(Shutdown Hook)、finally(try,catch)、finalize()调用场景及执行顺序
JAVA虚拟机关闭钩子(Shutdown Hook)、finally(try,catch)、finalize(),三者都能在虚拟机关闭前做一些操作,但是调用场景和执行顺序不一样。
1. JAVA虚拟机关闭钩子(Shutdown Hook)在下面场景下被调用:
1) 程序正常退出;
2) 使用System.exit();
3) 终端使用Ctrl+C触发的中断;
4)系统关闭;
5)OutOfMemory宕机;
6) 使用Kill pid命令干掉进程(注:在使用kill -9 pid时,是不会被调用的);
2. finally(try...catch..)
当try里面的代码引起的错误导致虚拟机关闭前,执行finally;
3.finalize()方法
虚拟机垃圾回收过程中执行的方法;
4.三个方法的执行顺序
1) 从java的API文档介绍可得Shutdown Hook会在finalize()之前执行:
2)写了一个测试类测试finally和Shutdown Hook的执行顺序,可以看出finally在Shutdown Hook之前执行:
package Test; public class ShutDownHookTest { public static void main(String[] args) { try { new ShutDownHookTest().addShutdownHook(); String strs= "hello"; strs.charAt(8); }catch(Exception e) { e.printStackTrace(); }finally { System.out.println("执行了finally!"); } } public void addShutdownHook() { Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { try { System.out.println("执行了ShutdownHook!"); } catch (Throwable t) { t.printStackTrace(); } } }); } }
3)这三个方法的执行顺序:finally-》Shutdown Hook-》finalize()
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。
您可能感兴趣的文章:
- Java虚拟机之类加载
- java虚拟机之JVM调优详解
- Java虚拟机内存区域划分详解
- 概述java虚拟机中类的加载器及类加载过程
- 深入了解Java虚拟机栈以及内存模型
- 浅析Java虚拟机详解之概述、对象生存法则
- Java跨平台原理与虚拟机相关简介
- java虚拟机jvm方法区实例讲解
- java虚拟机是做什么用的
- 详解Java 虚拟机垃圾收集机制
- Java虚拟机使用jvisualvm工具远程监控tomcat内存
- Java虚拟机常见内存溢出错误汇总
- Java虚拟机执行引擎知识总结
- Java启用Azure Linux虚拟机诊断设置
- Java虚拟机内存溢出与内存泄漏
- java虚拟机创建失败的原因整理
- Java内存模型中的虚拟机栈原理分析
- Java基础之创建虚拟机对象的过程详细总结