JVM的生命周期
虚拟机的启动 —> 虚拟机的执行 —> 虚拟机的退出
虚拟机的启动:
Java虚拟机的启动是通过引导类加载器(bootstrap classLoader)创建一个初始类(initial Class)来完成的, 这个类是由具体的虚拟机的实现来决定的(也就是不同的虚拟机这个初始化类也是不同的)
- 假设我们创建了一个自定义类, 其中有一个main()方法, 当我们执行该main()方法的时候首先要加载该main()方法所在的类, 而加载该类前要加载其父类object, 而其实在底层最初加载的类并不是object, 实际上加载一个类的时候即使这个类没有继承关系, 但是也会同时加载很多的其他类, 其中就包括了Object类, 注意: 这些加载的其他类中包括Object类都是一些官方的API, 所以都是使用引导类加载器来加载的
- 引导类加载器又称之为: 根类加载器
虚拟机的执行:
- 一个运行中的Java虚拟机有着一个清晰的任务: 执行Java程序
- 程序开始执行时JVM才运行, 程序结束时JVM也就会停止
- 执行一个所谓的Java程序的时候, 真真正正在执行的是一个叫做Java虚拟机的进程
- 一个Java虚拟机就是一个运行中的程序, 也就是一个进程
- 如果我们同时一台电脑上面运行了三个Java程序, 那么此时就有三个Java虚拟机正在运行
- Java虚拟机也是一个软件, 一个程序, 一个进程
- 一个Java虚拟机就是一个运行中的程序, 也就是一个进程
- 在终端(Terminal)中输入jps, 打印当前程序执行中的进程
虚拟机的退出:
- 程序正常执行结束
- 程序在执行过程中遇到异常或者是错误而异常终止
- 由于操作系统出现错误而导致Java虚拟机进程终止
- 某线程调用Runtime类或者是System类中的exit()方法, 或者Runtime类中的halt()方法, 并且Java安全管理器也是允许这次exit或者是halt操作(也就是要有足够的权限)
- Runtime类是一个饿汉式的单例类, 因为一个Runtime类的实例对应JVM中的运行时数据区(Runtime Data Area), 而一个JVM中只有一个运行时数据区, 那么也就是一个JVM进程中只会有一个Runtime类的实例
- System类中的静态exit()方法调用了Runtime类中的非静态exit()方法, 而Runtime类中的exit()方法有调用了Runtime类中的halt()方法, 而Runtime类中的halt()方法又调用了Shutdown类中的halt()方法, 然后Shutdown类中的halt()方法又调用了本地的halt()方法
- 除此以外, JNI(Java本地接口规范, Java Native Interface)规范描述了用JNI Invocation API来加载或者卸载JVM时, JVM的退出情况