JVM 的生命周期可分为三个阶段:加载、运行和销毁。
- 加载阶段
在加载阶段,JVM 会加载类的字节码,解析符号引用并将其转化为直接引用等操作。在加载阶段,JVM 会完成以下操作:
-
加载:通过类的全限定名获取类的二进制数据,并进行字节码解析和校验等操作,最终生成一个表示该类的 Class 对象,此对象包括类的成员变量和方法。
-
链接:
- 验证:进行字节码验证,确保字节码是正确且符合规范的;
- 准备:为类的静态变量分配内存,并赋默认值;
- 解析:将符号引用转换为直接引用,例如将虚方法转换为实际的内存地址等。
-
初始化:执行类的构造器,包括静态变量赋值和静态语句块的执行等操作。
- 运行阶段
在运行阶段,JVM 会执行字节码,并进行垃圾回收等操作。运行阶段可分为以下两个阶段:
- 字节码执行:根据方法调用栈的顺序执行字节码指令,包括对象的实例化、方法调用和执行等操作。JVM 使用即时编译器(JIT)对热点代码进行编译,从而提高程序的性能。
- 垃圾回收:JVM通过垃圾回收算法识别不再使用的对象并进行回收和释放,从而释放内存并提高系统的运行效率。
- 销毁阶段
在销毁阶段,JVM 会释放JVM占用的资源,并退出JVM进程。在此过程中,JVM 会依次执行以下操作:
- 调用对象的 finalizer 方法进行资源释放和清理;
- 执行 JVM 的关闭钩子(Shut Down Hooks);
- 最后进行垃圾回收,回收所有无用的资源后,JVM 进程退出。
总之,JVM的生命周期可分为加载阶段、运行阶段和销毁阶段,不同阶段执行着不同的操作,完成类加载、字节码执行、垃圾回收和资源释放等重要任务,保证了 Java 应用程序的正确运行和资源利用。