JVM运行一个类的流程可以分为以下几个主要阶段:
-
类加载(Loading)
- JVM通过类加载器(ClassLoader)查找并读取.class文件的二进制数据到内存
- 在内存中生成对应的java.lang.Class对象作为访问入口
- 类加载器采用双亲委派机制:先由父加载器尝试加载,父加载器无法完成时才由子加载器加载
-
链接(Linking)
- 验证(Verification):检查字节码是否符合JVM规范,确保安全性
- 准备(Preparation):为类变量(static变量)分配内存并设置默认初始值(如0、null等)
- 解析(Resolution):将常量池中的符号引用转换为直接引用(可选阶段)
-
初始化(Initialization)
- 执行类变量的显式初始化(如
static int x = 5;)和静态代码块 - 遵循父类优先初始化原则:先初始化父类,再初始化子类
- 执行类变量的显式初始化(如
-
执行
- 对于包含main方法的类,JVM会创建主线程并执行main方法
- 方法调用时会创建栈帧,包含局部变量表、操作数栈等信息
- 通过解释器或JIT编译器执行字节码指令
-
内存管理
- 对象实例存储在堆内存中
- 垃圾回收器自动管理不再使用的对象内存
示例执行命令:
java com.example.MyClass # 运行指定类
注意:类加载采用懒加载机制,只有在类首次被主动使用时才会触发加载过程。主动使用的情况包括:创建实例、调用静态方法、访问非final静态字段等。