Java程序在JVM中的执行过程如下:
- 编译期:将Java源码编译成字节码文件(.class文件)。
- 加载期:类加载器将字节码文件加载到内存,生成Class对象。
- 连接期:连接过程将类的二进制数据合并到JVM的运行时数据区,进行类验证、准备、解析等步骤。
- 初始化期:调用类构造器()方法,给静态变量赋初始值。
- 使用期:可以根据需要重复调用,执行程序的主要逻辑。
执行的两个阶段:
- 静态阶段(加载期、连接期、初始化期):加载和初始化类。
- 动态阶段(使用期):执行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");
}
}
该程序的执行过程如下:
- 加载并连接ExecuteDemo类,此时调用初始化阶段输出信息。
- 调用main方法,在本地变量表创建method1和method2的动态链接。
- 执行method1方法,此时操作栈压入信息,并输出“方法1”。
- 方法1返回,出栈信息,执行method2方法。
- 方法2执行并输出“方法2”。
- 方法2返回,main方法返回,程序结束。