Java程序是如何在JVM中执行的?代码举例讲解

Java程序在JVM中的执行过程如下:

  1. 编译期:将Java源码编译成字节码文件(.class文件)。
  2. 加载期:类加载器将字节码文件加载到内存,生成Class对象。
  3. 连接期:连接过程将类的二进制数据合并到JVM的运行时数据区,进行类验证、准备、解析等步骤。
  4. 初始化期:调用类构造器()方法,给静态变量赋初始值。
  5. 使用期:可以根据需要重复调用,执行程序的主要逻辑。

执行的两个阶段:

  1. 静态阶段(加载期、连接期、初始化期):加载和初始化类。
  2. 动态阶段(使用期):执行Java程序逻辑。

JVM对每个被调用的方法都会创建一个栈帧(Stack Frame)用于存储:
– 本地变量表:方法内部定义的局部变量。
– 操作栈:执行过程中生成的各种中间结果。
– 动态链接:方法调用的目标地址。
– 方法出口:方法正常返回或异常退出的地址。

来看一个简单例子:

public class ExecuteDemo {
    static {
        System.out.println("初始化阶段");
    }

    public static void main(String[] args) {
        method1();
        method2();
    }

    public static void method1() {
        System.out.println("方法1");
    }

    public static void method2() {
        System.out.println("方法2");
    }
}

该程序的执行过程如下:

  1. 加载并连接ExecuteDemo类,此时调用初始化阶段输出信息。
  2. 调用main方法,在本地变量表创建method1和method2的动态链接。
  3. 执行method1方法,此时操作栈压入信息,并输出“方法1”。
  4. 方法1返回,出栈信息,执行method2方法。
  5. 方法2执行并输出“方法2”。
  6. 方法2返回,main方法返回,程序结束。