艾丽游戏ing

虚拟机繁忙无法关闭 虚拟机仍然在忙关不掉

艾丽游戏ing 1

您好,今天小乐来为大家解答以上的问题。虚拟机繁忙无法关闭相信很多小伙伴还不知道,现在让我们一起来看看吧!

虚拟机繁忙无法关闭 虚拟机仍然在忙关不掉虚拟机繁忙无法关闭 虚拟机仍然在忙关不掉


1、关闭时,首先调用关闭钩子,所有钩子执行完毕后,如果需要进行垃圾回收就调用 finalize 方法,否则直接关闭虚拟机。

2、JVM 关闭过程中,不会中断或停止任何线程,在最终关闭虚拟机时强制关闭所有线程。

3、关闭钩子关闭钩子是一个可以在 JVM 关闭时执行的回调,可以通过 Runtime.addShutdownHook 进行注册。

4、JVM 关闭时首先会调用这些关闭钩子,但不会保证关闭钩子执行的顺序。

5、关闭钩子的执行时间要尽可能短,不应该再做耗时的操作,因为这会影响 JVM 的关闭时间。

6、```javaRuntime.getRuntime().addShutdownHook(new Thread(){//TODO});```如果调用关闭钩子时还有线程在运行,那么关闭钩子将和这些线程同时运行。

7、因此,关闭钩子的操作必须保证是线程安全的,访问数据需要使用同步机制,要避免死锁。

8、同时,关闭钩子需要考虑 JVM 关闭的所有可能性,不能假设关闭的原因,也不应该尝试去分析 JVM 关闭的原因。

9、关闭钩子通常用于服务的清理工作,如 dubbo 使用关闭钩子来关闭连接并通知注册中心注销服务。

10、但关闭钩子是并发执行的,需要考虑多个钩子之间的相互影响,如提前关闭日志服务可能导致其他钩子或线程无法再使用日志。

11、建议只使用一个关闭钩子来处理所有的事情,这样可以确保任务串行执行,从而避免多个钩子之间的竞争和死锁。

12、守护线程Java 中的线程分为普通线程和守护线程。

13、一个线程被创建时会继承创建它的那个线程的守护状态。

14、JVM 启动时创建的线程除了主线程是普通线程,其他线程(如 GC 等)都是守护线程。

15、当线程退出时,JVM 会检查剩余线程的状态,如果剩余的线程都是守护线程已经没有普通线程,那么 JVM 会进行关闭操作。

16、JVM 最终关闭时,守护线程会被直接抛弃,既不会执行 finally 也不会执行回卷栈。

本文到这结束,希望上面文章对大家有所帮助。