当Java应用程序中的所有非守护线程(即用户线程)都完成执行且没有其他活动线程时,JVM会正常退出。这是最常见的退出方式。
当代码中的任何位置调用 System.exit(int status) 方法时,JVM会立即开始终止过程。这个方法可以接受一个状态码,通常用0表示正常退出,非0表示异常退出。
与 System.exit() 不同,Runtime.getRuntime().halt(int status) 方法用于强制终止当前运行的Java虚拟机,而不会执行任何关闭钩子或者终止已注册的未捕获异常处理器。
当JVM遇到一个无法恢复的系统错误,如操作系统信号或内部错误,它可能会立即退出。比如JVM自身的bug或者本地方法库存在一些问题等。
但是需要注意的是,我们常见的一些ERROR,如OOM,并不会导致JVM立即退出:
但是,在在一些极端情况下,比如元空间(Metaspace)耗尽或JVM本身的资源不足,JVM可能会处于无法恢复的状态,从而导致整个JVM进程终止。
还有就是,有些JVM参数配置可能会在遇到OOM时导致JVM终止。例如,-XX:OnOutOfMemoryError="
如:XX:OnOutOfMemoryError="kill -9 %p"
在类Unix系统中,JVM进程可能会因为接收到某些类型的操作系统信号(如SIGKILL或SIGTERM)而立即退出。某些信号会导致JVM进行优雅地关闭,如执行关闭钩子,而某些信号则会导致JVM立即终止。
SIGTERM:kill -15
SIGKILL:kill -9