设为首页 加入收藏

TOP

RunTime.getRunTime().addShutdownHook 添加钩子
2019-05-14 12:12:46 】 浏览:52
Tags:RunTime.getRunTime .addShutdownHook 添加 钩子

看源码看到,Runtime.getRuntime().addShutdownHook(shutdownHook);

google了一下它的含义:在jvm中增加一个关闭的钩子,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添加的钩子,当系统执行完这些钩子后,jvm才会关闭。所以这些钩子可以在jvm关闭的时候进行内存清理、对象销毁等操作。


在了解关闭钩子之前,首先介绍一下Runtime.

  通过Runtime实例,使得应用程序和其运行环境相连接。Runtime是在应用启动期间自动建立,应用程序不能够创建Runtime,但是我们可以通过Runtime.getRuntime()来获得当前应用的Runtime对象引用,通过该引用我们可以获得当前运行环境的相关信息,比如空闲内存、最大内存以及为当前虚拟机添加关闭钩子(addShutdownHook()),执行指定命令(exec())等等。


那么,什么叫做jvm关闭呢。继续google,总结一下如下:

jvm的关闭方式有三种:

  1. 正常关闭:当最后一个非守护线程结束或者调用了System.exit或者通过其他特定平台的方法关闭(发送SIGINT,SIGTERM信号等)
  2. 强制关闭:通过调用Runtime.halt方法或者是在操作系统中直接kill(发送SIGKILL信号)掉JVM进程
  3. 异常关闭:运行中遇到RuntimeException异常等。

关闭钩子(shutdown hooks)

  在某些情况下,我们需要在JVM关闭时做些扫尾的工作,比如删除临时文件、停止日志服务以及内存数据写到磁盘等,为此JVM提供了关闭钩子(shutdown hooks)来做这些事情。另外特别注意的是:如果JVM因异常关闭,那么子线程(Hook本质上也是子线程)将不会停止。但在JVM被强行关闭时,这些线程都会被强行结束。

  关闭钩子本质是一个线程(也称为Hook线程),用来监听jvm的关闭。通过Runtime

的addShutdownHook可以向JVM注册一个关闭钩子。Hook线程在JVM正常关闭才会执行,强制关闭时不会执行。

  JVM中注册的多个关闭钩子是并发执行的,无法保证执行顺序,当所有Hook线程执行完毕,runFinalizersOnExit为true,JVM会先运行终结器,然后停止。

  注意事项:1.hook线程会延迟JVM的关闭时间,所以尽可能减少执行时间。

       2.关闭钩子中不要调用system.exit(),会卡主JVM的关闭过程。但是可以调用Runtime.halt()

       3.不能再钩子中进行钩子的添加和删除,会抛IllegalStateException

       4.在system.exit()后添加的钩子无效,因为此时jvm已经关闭了。

5.当JVM收到SIGTERM命令(比如操作系统在关闭时)后,如果钩子线程在一定时间没有完成,那么Hook线程可能在执行过程中被终止。

       6.Hook线程也会抛错,若未捕获,则钩子的执行序列会被停止。


编程开发网
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇maven学习(下)利用Profile构建.. 下一篇centos-7 部署hadoop2.5.1 >&g..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

array(4) { ["type"]=> int(8) ["message"]=> string(24) "Undefined variable: jobs" ["file"]=> string(32) "/mnt/wp/cppentry/do/bencandy.php" ["line"]=> int(217) }