Runtime ApplicationShutdownHooks , Shutdownhook


一。Runtime

这个类是代表jvm运行时的类,


---可以看出,整个jvm只有一个Runtime实例


1.exit(int status)  

可以看出,这个方法首先要进行安全检查,然后调用Shutdown.exit(int status)



2.addShutdownHook(Thread)/removeShutdownHook(Thread)  :添加/移除注册钩子   -------- 实际上调用的是ApplicationShutdownHooks.add(hook) /ApplicationShutdownHook.remove(hook).



3.halt(int status)



Forcibly terminates the currently running Java virtual machine. This method never returns normally.

This method should be used with extreme caution. Unlike the exit method, this method does not cause shutdown hooks to be started and does not run uninvoked finalizers if finalization-on-exit has been enabled. If the shutdown sequence has already been initiated then this method does not wait for any running shutdown hooks or finalizers to finish their work.

Parameters:
status Termination status. By convention, a nonzero status code indicates abnormal termination. If the exit (equivalently, System.exit) method has already been invoked then this status code will override the status code passed to that method.

意思如下: 终止正在运行的虚拟机 这个方法要小心使用。不像exit方法,halt方法,不会使任何的注册钩子执行,即使启用finalization-on-exit,也不会运行没有被调用的finalizers 如果shutdown序列已经初始化,这个方法不会等任何钩子线程或者finalizers工作完成,就可以终止jvm 。通常情况下,一个非零的状态码表示不正常的终止,如果exit方法已经运行,halt的状态码会覆盖exit的状态码

4.freeMemory , totalMemory

freeMemory :jvm当前可用字节数

totalMemory:jvm一共字节数




5.gc和runFinalization的区别  

插入:System.runFinalizationOnExit(boolean) : 程序exit退出时,执行每个对象的finalize方法


gc方法

Calling the gc method suggests that the Java Virtual Machine expend effort toward recycling unused objects in order to make the memory they currently occupy available for quick reuse.

When control returns from the method call, the Java Virtual Machine has made a best effort to reclaim space from all discarded objects. 

解释:调用这个方法表明jvm会   尽力  回收没有被使用的对象,并释放对象所占的内存,当方法返回的时候,jvm对于所有的被遗弃的对象已经尽力回收空间

runFinalization方法:

Runs the finalization methods of any objects pending finalization. Calling this method suggests that the Java Virtual Machine expend effort toward running thefinalize methods of objects that have been found to be discarded but whosefinalize methods have not yet been run.

When control returns from the method call, the Java Virtual Machine has made a best effort to complete all outstanding finalizations. 

------对象的空间被收回之前做的一些事情,比如释放对象占用的资源


解释:运行任何处于终结状态对象的finalization方法。


个人理解:

gc和finalize分别由单独的线程运行,当调用System.gc时,相当于向gc(垃圾收集器)线程发送一条指令,建议垃圾收集器线程,回收被遗弃(discarded)的对象,释放他们所占的内存,但是这个指令也就只能是个建议,垃圾收集器,可能会执行这个指令,然后调用所有处于终结状态(pending finalization)对象的finalize方法,当然如果对象的finalize方法正在运行,则不调用,之后,回收对象所占的内存。而调用finalize方法表示finalize线程会调用被遗弃的对象的finalize方法(前提是他们的finalize方法没有被调用)


废话不说,上图




一种情况就是:一个被废弃的对象的finalize方法还没有被执行就被gc回收了;但是如果使用runFinalization就不一样了,在被gc回收之前会调用对象finalize方法,然后等着被gc回收



6.traceMethodCalls ,traceInstructions   ------没遇见过使用的情况


二。ApplicationShutdownHooks

1.这个类是给Runtime的hooks接口,Runtime类可以利用这个类注册shutdownhooks,移除shutdownhooks(addShutdownHook,removeShutdownHook)。ApplicationShutdownHooks类负责向Shutdown类中注册ApplicationShutdownHook

介绍几个前提:

Shutdown过程分为两步,第一步运行shutdownhooks,第二步运行还没运行的finalizers(finalizer我们上面说过)

而shutdownhooks又分为三类: 

第一类:console restore hooks

第二类:application hooks  ------> 我们主要就是用ApplicationShutdownHooks

第三类: DeleteOnExit hook

好,有个脑海里面的这些知识,我们分析ApplicationShutdownHooks类 

ApplicationShutdownHooks是Shutdown类提供给Runtime的一个接口。



这样就能理解为什么说ApplicationShutdownHooks是Shutdown提供给Runtime的接口了把,如果还没理解,废话不说,上图



用户可以直接使用Runtime类中的方法,也可以使用System类中的方法(System类使用了Runtime类),然后Runtime使用了ApplicationShutDownHooks,和Shutdown这两个类,ApplicationShutdownHooks类专注于hooks的注册,移除,运行,而Shutdown则专注于与关机有关的事情(1.运行shutdownhooks 2.执行还没被调用的finalizers)



2.addShutdownHooks,removeShutdownHooks 添加或移除注册钩子 ,注意:这两个方法是同步方法


3.runHooks这个方法讲一下,废话不说,上图



三。Shutdown

这个类着重分析一下




1.add



2.exit ,shutdown区别







总结一下上面的exit的逻辑


    


status  : 0和非零的区别在于runFinalizersOnExit是否有作用,如果status非零,那么处于RUNNING和HOOKS状态下shutdown不会执行finalizers,处于FINALIZERS状态下的Shutdown直接halt。如果为零,就不会强制把runFinazliersOnExit置为false。就会走正常流程



shutdown方法



可以看出,shutdown方法只是执行sequence方法(就是我们说的shutdown sequence) ,并没有执行关机(halt) 动作


所以说,exit 和shutdown方法的区别在于是否执行关机动作,exit最后是关机,而shutdown只是执行shutdown seqeuence ,和exit相比少了一个halt方法。就是说shutdown之后,没有关机。---------------------我靠,这不就是咱们关电视的时候没有把电源吗!!!!!! -_-!!!!!!     (所以说shutdown 可以比喻成用遥控器关机,而halt比喻成拔电源)






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值