当前位置: 首页 > news >正文

java shutdownhook

为什么80%的码农都做不了架构师?>>>   hot3.png

参考:http://blog.yohanliyanage.com/2010/10/know-the-jvm-2-shutdown-hooks/

java doc: http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html

1、ShutdownHook在某些情况下不会运行

ShutdownHook从不不保证一定会运行。当JVM由于内部原因崩溃,或接收到操作系统发送的SIGKILL命令等,关闭钩子来不及运行JVM进程就已经退出。


2、ShutdownHook可能在运行过程中被中止

操作系统在关闭过程中,发送SIGTERM命令给JVM,如果JVM不能在一定的时间内结束,例如ShutdownHook执行时间过长等,那ShutdownHook就很有可能在执行过程中被中止。
所以ShutdownHook必须能快速执行完,避免会发生阻塞的IO操作或锁相关的操作。


3、当存在多个ShutdownHook时,JVM在执行的时候不保证顺序

在jdk1.5的Shutdown类中,可以看到ShutdownHook都保存在一个HashSet中,JVM退出时迭代整个HashSet并分别调用线程的start方法。并发执行,而不是添加时的顺序。


4、在JVM关闭过程中不能添加或者去除ShutdownHook

当JVM开始关闭,则不允许再进行ShutdownHook的添加和删除操作,否则抛出IllegalStateException,即不能在ShutdownHook中添加或去除ShutdownHook。


5、不能在ShutdownHook中调用System.exit()

当在ShutdownHook中调用System.exit(),不会停止ShutdownHook反而会卡住整个JVM,只能kill -9强制中止进程(jdk1.5进行了验证)。但可以调用Runtime.halt()。


6、ShutdownHook抛出的异常和其他普通异常一样,由Uncaught Exception Handler进行处理



7、如果创建匿名内部线程类作为ShutdownHook线程,则容易发生内存泄漏。

这个是开发中遇到的问题,工具函数以匿名内部类的方式创建了很多ShutdownHook,由于内部匿名类会持有外层类的引用,导致外层类对象也一直无法释放。


8、Eclipse中调试shutdownhook

Eclipse的红色的Terminate按钮是强制关闭程序,类似kill -9,没法调用shutdownhook;

变通方法起一个线程开启监听console输入,回车后,调用 System.exit(0);就会触发shutdownhook

private static class ExitThread extends Thread{
        
        public void run() {
            System.out.println("==============eclipse debug==================");
            System.out.println("press ENTER to call System.exit(0) ");  
            System.out.println("==============eclipse debug==================");
            try {  
                System.out.println(System.in.read());
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
            System.exit(0);  
        }
    }




转载于:https://my.oschina.net/greki/blog/312537

相关文章:

  • poj_3468,线段树成段更新
  • 捧上天的AI落地困难,“ 不懂变通”的华为云如何应付?
  • 二叉树的锯齿形层次遍历
  • LINUX下禁止root用户远程登录
  • 项目中常用的19条MySQL优化
  • linux系统优化
  • Java版人脸识别SDK 虹软arcface (demo)
  • 一张图告诉你,只会jQuery还不够!
  • Istio 1.1 版本发布,性能和可用性提升
  • 桥牌笔记:Skill Level 4 D8
  • datax同步MySQL数据到mongodb
  • zephir的安装
  • jav核心(十四):集合类型操作:Collection、List、Set;Map集合;Iterator迭代器
  • 赋值,copy和deepcopy
  • 洛谷 4382 [八省联考2018]劈配——二分图匹配
  • 《剑指offer》分解让复杂问题更简单
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 【刷算法】求1+2+3+...+n
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • 03Go 类型总结
  • Docker下部署自己的LNMP工作环境
  • laravel 用artisan创建自己的模板
  • leetcode98. Validate Binary Search Tree
  • Mithril.js 入门介绍
  • node.js
  • php的插入排序,通过双层for循环
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Python 反序列化安全问题(二)
  • python大佬养成计划----difflib模块
  • vue:响应原理
  • 爱情 北京女病人
  • 给第三方使用接口的 URL 签名实现
  • 机器学习中为什么要做归一化normalization
  • ------- 计算机网络基础
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 前嗅ForeSpider教程:创建模板
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 小李飞刀:SQL题目刷起来!
  • 中文输入法与React文本输入框的问题与解决方案
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • ​水经微图Web1.5.0版即将上线
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • (3)选择元素——(17)练习(Exercises)
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (安卓)跳转应用市场APP详情页的方式
  • (全注解开发)学习Spring-MVC的第三天
  • (十八)SpringBoot之发送QQ邮件
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (五)IO流之ByteArrayInput/OutputStream
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • .net 7 上传文件踩坑
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions