JVM关闭

本文介绍了JVM的关闭过程,包括正常关闭和强行关闭。正常关闭时,当最后一个非守护线程结束或调用System.exit时触发。关闭钩子是注册的未启动线程,用于执行清理任务。守护线程不影响JVM退出,而终结器用于释放持久化资源。在编写关闭钩子时应注意线程安全和快速退出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 正常关闭:

 1.当最后一个“正常(非守护)”线程结束时

 2.当调用System.exit时

 3.通过其它特定于平台的方法关闭(例如发送了SIGINT信号或键入Ctrl+C)

 强行关闭:

 1.调用Runtime.halt

 2.在操作系统中“杀死”JVM进程(例如发送SIGKILL)


1.关闭钩子(Shutdown Hook)

 关闭钩子指通过Runtime.addShutdownHook注册的但尚未开始的线程。JVM并不能保证关闭钩子的调用顺序,在关闭应用程序线程时,如果有(守护或非守护)线程仍然在运行,那么这些线程接下来将与关闭进程并发执行。当所有的关闭钩子都执行结束时,如果runFinalizersOnExit为true,那么JVM将运行终结器,然后再停止。

 JVM并不会停止或中断任何在关闭时仍然运行的应用程序线程。当JVM最终结束时,这些线程将被强行结束。如果关闭钩子或终结器没有执行完成,那么正常关闭进程“挂起”并且JVM必须被强制关闭,当被强制关闭时,只是关闭JVM,而不会运行关闭钩子。

 关闭钩子应该是线程安全的:它们在访问共享数据时必须使用同步机制,并且小心地避免发生死锁,这与其它并发代码的要求相同。而且,关闭钩子不应该对应用程序的状态(例如,其它服务是否已经关闭,或者所有的正常线程是否已经执行完成)或者JVM的关闭原因做出任何假设。最后,关闭钩子必须尽快退出,否则会延迟JVM的结束时间。

关闭钩子的作用:

 1.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值