码农每日一题

长按关注,工作日每天分享一个技术知识点。

Shutdown Hooks 是一种特殊的结构,它允许开发人员插入 JVM 关闭时执行的一段代码。

用途

Application 正常退出(所有线程完成时,或在调用 System.exit(0) 时),执行特定的业务逻辑或关闭资源等操作。

Application 非正常退出(用户按下 Ctrl+C、操作系统关闭(kill pid,不带-9)),在退出时执行必要的挽救措施。

用法

示例:

1public class ShutDownHook{

2    public static void main(String[] args){

3

4        Runtime.getRuntime()

5               .addShutdownHook(new Thread(() -> System.out.println("Shutdown Hook is running !")));

6        System.out.println("Application Terminating ...");

7    }

8}

输出:

1Application Terminating ...

2Shutdown Hook is running !

可以看到 Shutdown Hook is running ! 输出在 Application Terminating ... 之后。

陷阱

在某些情况下,可能无法执行 Shutdown Hook。

如果 JVM 由于某些内部错误而崩溃,则它可能崩溃而没有机会执行一条指令。

另外,如果操作系统发出 SIGKILL 信号(在 Unix/Linux 中为 kill -9)或 TerminateProcess(Windows),则要求应用程序立即终止而无需甚至在等待任何清理活动。

除上述内容外,还可以通过调用 Runtime.halt() 方法来终止 JVM,而不允许运行 Shutdown Hook。

启动后,可以在完成之前强行关闭 Shutdown Hook。

在诸如操作系统关闭之类的情况下,有可能在 Shutdown Hook 完成之前将其终止。

在这种情况下,一旦给出 SIGTERM,O/S 将等待进程终止指定的时间。

如果该过程未在此期限内终止,则操作系统将通过发出SIGTERM(或Windows中的对应程序)来强制终止该过程。

因此,当关闭 Shutdown Hook 执行到一半时,可能会发生这种情况。

因此,建议确保 Shutdown Hook 的谨慎书写,以确保它们快速完成,并且不会引起死锁等情况。另外,JavaDoc 特别提到不应在 Shutdown Hook 中执行长时间计算或等待用户 I/O 操作。

可以有多个 Shutdown Hook,但是不能保证它们的执行顺序。

可以注册多个 Shutdown Hook,但是 JVM 无法保证其执行顺序(shutdownHooks 存放在 IdentityHashMap 中),JVM 可以按任意顺序执行关闭 Shutdown Hook,也可能会同时执行 Shutdown Hooks。

1public void addShutdownHook(Thread hook){

2    SecurityManager sm = System.getSecurityManager();

3    if (sm != null) {

4        sm.checkPermission(new RuntimePermission("shutdownHooks"));

5    }

6    ApplicationShutdownHooks.add(hook);

7}

8

9class ApplicationShutdownHooks{

10    /* The set of registered hooks */

11    private static IdentityHashMap hooks;

12    static synchronized void add(Thread hook){

13        if(hooks == null)

14            throw new IllegalStateException("Shutdown in progress");

15

16        if (hook.isAlive())

17            throw new IllegalArgumentException("Hook already running");

18

19        if (hooks.containsKey(hook))

20            throw new IllegalArgumentException("Hook previously registered");

21

22        hooks.put(hook, hook);

23    }

24}

关闭程序开始后,无法注册/取消注册 Shutdown Hook。

一旦关闭程序是由 JVM 发起的,将不在允许添加或删除任何现有的 Shutdown Hook,否则抛出 IllegalStateException 异常。

关闭程序开始后,只能由 Runtime.halt() 停止。

一旦关闭程序开始,只有 Runtime.halt()(强制终止 JVM)可以停止执行关闭序列(除了诸如 SIGKILL 之类的外部影响之外)。这意味着在 Shutdown Hook 中调用 System.exit() 将不起作用。实际上,如果在 Shutdown Hook 中调用 System.exit(),VM 可能会卡住,我们可能不得不强制终止该过程。

使用 Shutdown Hook 需要安全权限。

如果我们使用的是 Java Security Manager,则执行添加/删除 Shutdown Hook 的代码在运行时需要具有 shutdownHooks 权限。如果我们在安全的环境中未经许可调用此方法,则将导致 SecurityException。

作者:河西

链接:https://juejin.im/post/5e0d9c4b6fb9a048411a4af6

参考:https://www.geeksforgeeks.org/jvm-shutdown-hook-java/

java hook全局钩子,牛逼骚操作:Java 虚拟机关闭钩子(Shutdown Hook)!相关推荐

  1. 17个Python的牛逼骚操作,你都OK吗?

    Python 是一门非常优美的语言,其简洁易用令人不得不感概人生苦短.在本文中,作者 Gautham Santhosh 带我们回顾了 17 个非常有用的 Python 技巧,例如查找.分割和合并列表等 ...

  2. 牛逼的uniapp+Java微信小程序商城来了

    牛逼的uniapp+Java微信小程序商城来了 减少重复造轮子,开源微信小程序商城(前后端开源:uniapp+Java),秒杀.优惠券.多商户.直播卖货.分销等功能.快速搭建一个属于自己的微信小程序商 ...

  3. java面试题28 牛客 下面有关java classloader说法错误的是?

    java面试题28 牛客 下面有关java classloader说法错误的是? A Java默认提供的三个ClassLoader是BootStrap ClassLoader,Extension Cl ...

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

    Java程序经常也会遇到进程挂掉的情况,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的代码.JAVA中的ShutdownHook提供了比较好的方案. JDK提供了Java ...

  5. java 布隆过滤器_牛逼哄哄的布隆过滤器,到底有什么用?

    Java技术栈 www.javastack.cn 打开网站看更多优质文章 作者:CodeBear的园子 www.cnblogs.com/CodeBear/p/10911177.html 本文是站在小白 ...

  6. 几位阿里朋友重写的Java并发编程,牛逼了

    昨天在黄金时代群里和读者聊机械键盘大 F 的时候,好朋友 cxuan 推了一篇文章,吸引了我的眼球,名叫"太赞了,阿里几位工程师重写了 <Java 并发编程>",我看完 ...

  7. java putifabsent_java8中Map的一些骚操作总结

    一 前言 本篇内容是关于 map 新特性的一些方法使用上的介绍,如果有不足之处欢迎补充!! 二 map新特性 关于以下函数式编程的函数的计算知识追寻者都使用 简单字符串代替了,参数无非就是Key,va ...

  8. nodemanager不能正常关闭_Java虚拟机关闭钩子(Shutdown hook)

    作者:俩右 出处:https://segmentfault.com/a/1190000038298447 源码点击 study:https://github.com/xiaoshuanglee/stu ...

  9. layui.open 关闭之后触发_JAVA虚拟机关闭钩子(Shutdown Hook)

    前言 当你认真的去看一个组件的源码的时候,你会经常看见这种关闭钩子的函数,如果你不了解的话,谷歌一下,你就会发现如下文章就是搜索引擎出来的第一篇,不愧是出自我们优秀的厮哒哒之笔. 正文 Java 程序 ...

最新文章

  1. 解决 win10+pycharm 环境 Matplotlib图表不能在Pycharm中显示的等问题
  2. BSPreloadTableVew带有预加载功能的tableView
  3. 【Android 异步操作】线程池 ( 线程池作用 | 线程池种类 | 线程池工作机制 | 线程池任务调度源码解析 )
  4. 数组元素数组中的元素通过解析字符串参数获得
  5. J2EE-RBAC权限管理
  6. selenium 控制ie_牛鹭学院:selenium入门基础及中级进阶
  7. JS小技巧 ----- 将类数组 / 字符串转为数组的几种方式
  8. QThread(一)_vortex_新浪博客
  9. gstreamer插件开发_测评丨高性能多媒体处理器—飞凌OKMX8MM-C开发板
  10. HDOJ Problem - 1299
  11. 最新河南电信、网通(联通)、铁通DNS地址ip
  12. 解决:TransportException: Cannot execute request on any known server
  13. 【单片机笔记】基于LM358的差分放大,电流检测电路
  14. 观《达芬奇的人生密码》有感——艺工交叉的智慧
  15. python交易是什么意思_py交易什么意思
  16. ORACLE EBS中附件功能的使用
  17. C#使用随机数模拟器来模拟世界杯排名(三)
  18. 【点云处理常见的开源库】
  19. 米家机扫拖机器人说明书_米家扫拖机器人1C评测:“看”得见才能打扫干净
  20. android 仿微信demo————微信顶部操作栏界面实现

热门文章

  1. python图层合并_Ps算法Python实现:图层混合模式-色相
  2. c#求三角形面积周长公式_C#源代码—三角形面积、圆的面积
  3. js日期控件_11个开源的Github开源日期选择器组件,供你选择
  4. cassss服务未启动_Mysql无法启动情况下,如何恢复数据呢?
  5. matlab傅里叶变换去噪代码,小波的分析在心电信号去噪中应用(内附Matlab去噪源代码).ppt...
  6. .Net Framework4.5中Asp.net mvc使用Singal R轮训实现导入进度条功能
  7. http模拟登陆及发请求
  8. ios APP进程杀死之后和APP在后台接收到推送点击跳转到任意界面处理
  9. c# 多线程实现ping 多线程控制控件
  10. vue 父向子组件传递数据,子组件向父组件传递数据方式