总的来说,JVM的生命周期可简单分为启动、运行、退出三个部分。

启动

JVM通过引导类加载器,创建一个初始类来完成启动。

程序执行某个方法,首先需要将所在类加载到内容中,这是一个自定义类,这个类通过系统类加载器加载。父类是Object,Object需要被引导类加载器加载。除了Object类,程序运行还需要很多类的加载来实现,所有依赖的类都加载后,JVM才完成了启动。最早加载的类称为初始类。


public class Test07 {
    public static void main(String[] args) {
        System.out.println("123");
    }
}


示例代码中,main方法运行,需要Test07类加载,Test07就属于自定义类,通过系统类加载器加载,Test07没有指定父类,默认就是Object类,被引导类加载器加载。这里需要说明,Object并不是初始类,除了Object类外,还有很多需要加载的类库。


java 服务被自动kill java进程自动退出_加载


运行

Java程序的运行,实际上是一个JVM进程在运行。这个大家可以写一个简单程序,休眠几秒,看一下运行中的进程。


public class Test07 {
    public static void main(String[] args) throws InterruptedException {
        Thread.sleep(10000);
        System.out.println( "done");
    }
}


运行程序,在命令行窗口执行jps指令,可以看到运行中的进程:


java 服务被自动kill java进程自动退出_java让程序暂停几秒_02


当程序运行结束后,进程也就自然消失,所以说,java程序的运行,是JVM的进程在运行,如果进程终止,java程序也就随之停止。

退出

JVM的退出有很多中情况,这里简单说明下:

  1. 程序正常结束运行,比如上面的示例中,main方法全部执行完毕后,程序退出。
  2. 程序中调用了Runtime或System的exit方法,或者Runtime的halt方法,并且Java安全管理也允许操作是,也会退出JVM
  3. 程序运行过程中,遇到异常错误终止了
  4. 操作系统、硬件原因,导致JVM进程被结束,导致JVM退出

跟踪System.exit方法可知,最终调用Shutdown.halt方法,继而调用halt的本地方法实现了退出。


java 服务被自动kill java进程自动退出_加载_03


java 服务被自动kill java进程自动退出_java让程序暂停几秒_04


java 服务被自动kill java进程自动退出_java 服务被自动kill_05


这里再提一点,之前说JVM结构时,说到JVM的运行时数据区,对应的其实就是Runtime类。所以Runtime是一个单例模式,对应一个进程。