java hook全局钩子,牛逼骚操作:Java 虚拟机关闭钩子(Shutdown Hook)!_梦也何曾到谢桥的博客-程序员信息网

技术标签: java hook全局钩子  

码农每日一题

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

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/

f5381c98736df729c78d968861def246.gif

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34788662/article/details/115990375

智能推荐

hdu 1728 逃离迷宫(dFS+优先队列)__YAN的博客-程序员信息网

求转弯最少的走路方式!!!!#include#include#includeusing namespace std;struct node{int x,y;int step;friend bool operator{return a.step>b.step;}};char map[200][200];int vis

中兴设备交换机路由器清除清理指定接口计数的统计信息命令_一切V随缘的博客-程序员信息网_中兴交换机清楚配置

描述:中兴设备交换机路由器清除清理指定接口计数的统计信息命令命令:clear statistics interface 端口名 #清除端口计数

搭建属于自己的云测试平台_hm372788571的博客-程序员信息网

最近老大给了一个资料让研究。需要搭建一个平台,把公司所有的测试机集中在一起管理,谁需要用的时候,直接在web页面使用。省去了到处找别人借手机等问题。下面先介绍以下这个平台。STF(Smartphone Test Farm)是一个Web应用程序,用于从您的浏览器中远程调试智能手机,智能手表和其他小工具。(这个介绍其实是cope官方的,懒得cope了,自己去看吧)STF github下载地址贴两...

【它山之玉】研究生回复审稿意见的门道---科学网马臻_兔子爱读书的博客-程序员信息网

【笔记】还有的作者长篇大论地向审稿人解释,并把修改过的段落附上,但长篇解释和新增段落的内容几乎一样,这就没有必要了。逐条回复要务实、干脆利落,要不惊不乍,而不要让编辑觉得“问题很大”以至于作者需要用很大的篇幅来解释问题。如果初审时审稿人的定性评价很负面怎么办?那也得如实呈现。既然编辑决定让你修改论文,只要你认真修改,论文最终发表的可能性很大。对审稿人不要犟,而要有策略。审稿人总是认为...

Java集合框架(常见面试题总结)_zangqijie123的博客-程序员信息网

1、List接口的实现类(1)数组列表ArrayList和链表LinkedList:ArrayList实现了可变的数组,允许保存所有元素,包括null,并可以根据索引位置对集合进行快速的随机访问。缺点是向指定的索引位置插入或删除对象的速度较慢。 LinkedList类采用链表结构保存对象,这种结构的优点是便于向集合中插入和删除对象,但对于随机访问集合中的对象效率较低。(2)访问实现了l...

IDEA新建文件自动加入SVN,删除文件自动从SVN中删除_时光下的旅途的博客-程序员信息网_idea svn 删除文件

1、新建文件:    File  -> Setting -> Version Control -> Confirmation  -> When files are created -> Add silently       2、删除文件  File  -> Setting -> Version Control -> Confirm...

随便推点

Unity3D开发:Unity3D中的脚本概述_普通网友的博客-程序员信息网

和其他的3D软件一样,Unity3D作为一个类播放器的3D集成软件,具有良好的时间层级关系。比如Start()里面的语言,总是在播放器初始化时执行一次,而后就不再执行。例如下面用JS写的一个例子。在菜单栏上选中  ——>  ——>  ,将下面这段代码拖拽给Hierarchy【层次清单栏】中任意一个对象。您就会在播放器刚开始播放的时候,在左下角的控制台面板中看到  这句话,证

Java基本算法_编程领域的博客-程序员信息网_java算法

整理一下常用的又基础的算法。由于平时的项目比较简单,很少用到算法,但工作不只是眼前的苟且,还有诗和远方。1.链表链表用来存储数据,由一系列的结点组成。这些结点的物理地址不一定是连续的,即可能连续,也可能不连续,但链表里的结点是有序的。一个结点由数据的值和下一个数据的地址组成。一个链表内的数据类型可以是多种多样的。数组也是用来存储数据的,与链表相比,需要初始化时确定长度。一个数组内的数据都是同一类型。在Java中,ArrayList是通过数组实现,而LinkedList则通过链表实现。一个简单的链表类

通俗易懂:比特币挖矿原理_爱上的云的博客-程序员信息网_比特币挖矿原理

“比特币挖矿主要是通过算法来获得比特币,在比特币系统中,每10分钟就会有一个节点挖矿成功,而一旦有人挖矿成功,比特币系统就会奖励此人一定数量的比特币,这个数量是通过算法控制的。而比特币挖矿的原理就是POW算法(工作量证明算法)。比特币挖矿就是根据挖矿贡献的有效工作,来决定货币的分配。”那POW算法在比特币系统是怎样应用的?中本聪在设计实现比特币系统的时候,希望每10分钟完成一次比特币发行,由于比特币网络中有成千上万个节点,那该把币发行给谁呢?按照工作量证明的策略,也就是POW算法的思路,中本聪在比特币系

百度2019校招Web前端工程师笔试卷(9月14日)_aicongchuo5501的博客-程序员信息网

8月27日晚,在实习公司加班。当时正在调试页面,偶然打开百度首页console,发现彩蛋,于是投了简历。9月14日晚,七点-九点,在公司笔试。笔试题型(有出入):一、单选20道  1、难度不难,考的广而已。虽是前端,但有操作系统,linux,算法,数据结构,计算机网络等等。涉及前端的题目,So easy!!!二、不定项10道  1、忘了考啥,没印象了。本题不涉及前...

MyBatis学习笔记整理详细_发奋的小张的博客-程序员信息网

MyBatis笔记文章目录MyBatis笔记1.配置2.目录结构3.MyBatisUtils.java配置4.pom.xml配置5.Mapper.xml配置6.mybatis-config.xml配置7.CRUD操作1.namespace2.select3.增删改均需要提交事务,否则数据无法写入数据库4.优化CRUD操作1.万能Map2.模糊查询8.配置解析1.核心配置文件2.环境配置(environments)3.属性(properties)(掌握)4.类型别名(typeAliases)(掌握)5.设置

医疗时鲜资讯:医疗领域入口的划分_zssure的博客-程序员信息网

背景: 医疗时鲜资讯系列的出发点是整理和摘录医疗行业的最新资讯,当然不可能只摘录,那我一个人怎能比得上健康界、HC3I——这两个是我有勇气写该系列博文的支撑。近期拜读了医库软件董事长Dr.2的系列文章,深受启发遂决定修改一下该系列博文的角度:以一个医疗设备相关软件开发从业人员的角度来观察医疗行业,从“医院、医生、患者、设备”四个大的方向来整理相关资讯,发表自己的些许感想。

推荐文章

热门文章

相关标签