Shutdown Hook

最近了解了一下Java中ShutdownHook的特性,网上有几篇讲述得很全面的文章,做些记录如下:
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,由于内部匿名类会持有外层类的引用,导致外层类对象也一直无法释放。
引用:Know the JVM 2 : Shutdown Hooks

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值