当前位置:首页 > 虚拟机 > 正文

虚拟机无法强制关闭怎么办


一、虚拟机关不了机怎么办关闭时,先调用shutdown钩子,所有钩子执行完毕后,如果需要垃圾回收,则调用finalize方法,否则直接关闭虚拟机。
在JVM关闭过程中,不会终止或停止任何线程,并且当虚拟机最终关闭时,所有连接都将被强制关闭。
Huckshutdown
shutdownhook是JVM关闭时执行的回调,可以通过tdownHook注册。当JVM关闭时,这些关闭钩子将首先被调用,但不保证关闭钩子的执行顺序。
shutdownhook的执行时间应尽可能短,并且不要执行耗时的操作,因为这会影响JVM关闭时间。
```java
time().addShutdownHook(newThread(){
//TODO
});
```
如果调用关闭钩子时有线程在运行,则关闭钩子将与这些线程同时运行。因此,钩子关闭操作必须是线程安全的,并且必须使用同步机制来访问数据以避免死锁。同时,关闭陷阱必须考虑所有JVM关闭的可能性。它不能假设关闭的原因,也不应尝试分析JVM关闭的原因。
关闭组通常用于服务清理。然而,关闭钩子是并发执行的,必须考虑多个钩子之间的交互。
建议仅使用一个闭合钩来处理所有事情。这样可以保证任务串行执行,避免多个钩子之间的竞争和死锁。
守护线程
Java中的线程分为普通线程和守护线程。当一个线程被创建时,它会继承创建它的线程的守护进程状态。除主线程外,JVM启动时创建的线程都是常规线程,其他线程(GC等)都是守护线程。
当一个线程退出时,JVM会检查剩余线程的状态,如果剩余线程都是线程且没有公共线程,则JVM将关闭。
当JVM最终关闭时,守护线程将被直接放弃,并且finally和stackreturn都不会被执行。因此,应尽量不要使用守护线程,使用时只进行简单的操作。
垃圾收集
关闭JVM的最后一步是执行垃圾收集,主要是文件资源或套接字。这一步主要是调用finalize方法进行资源的最终释放。Finalize方法访问的数据可以被其他线程并发访问,并且必须同步控制访问。
JVM不保证finalize方法什么时候会被调用,甚至不保证是否会调用finalize方法。