java并发学习之JVM关闭
一.JVM关闭
当我们创建一个主线程时,JVM都会创建一个JVM实例进程来运行线程,JVM进程既可以正常关闭,也可以强行关闭。
正常关闭的触发方式有很多:1)当最后一个“正常(非守护)”线程结束时 。2)调用了System.exit 。3)通过其他特定于平台的方法关闭。
强行关闭:我们也可以通过调用Runtime.halt或者操作系统中 “杀死” JVM进程的指令来强行关闭JVM。
那么JVM是如何关闭的呢?
1.关闭钩子
在正常的关闭中,JVM首先调用所有已注册的关闭钩子(Shutdown Hook)。
关闭钩子是指通过Runtime.addShutdownHook注册的但尚未开始的线程。 JVM并不能保证关闭钩子的调用顺序。
1)在关闭应用程序线程时,如果有线程仍然在运行,那么这些线程接下来将与关闭进程并发执行。
当所有钩子都执行结束时,如果runFinalizersOnExit为true,那么JVM将运行终结器,然后再停止。
JVM并不会停止或中断任何在关闭时仍然运行的应用程序线程。当JVM最终结束时,这些线程将被强行结束
2)如果关闭钩子或终结器没有执行完成,那么正常关闭进程 “挂起” 并且JVM必须被强行关闭。 当被强行关闭时,只是关闭JVM,而不会运行关闭钩子。
3)关闭钩子应该是线程安全的:它们在访问共享数据时必须使用同步机制,并且小心地避免发生死锁,这与其他并发代码的要求相同。关闭钩子不应该对应用程序的状态或者JVM的关闭原因做出任何假设

浙公网安备 33010602011771号