JVM角度的Java程序执行过程
本文最后更新于 2025年8月4日 下午
Java的执行过程
经过之前的整理现在我们讨论以下JAVA程序的执行过程
- JVM加载到内存,完成其所需的结构创建(一些内部对象的创建,GC,ObjectMonitor等)
- 根据传入的启动类进行启动类加载。
- 执行加载-验证-准备-解析-初始化过程 该启动类的过程
- 检查该类是否有指向父类的指针,如果有则从父类开始进行加载。最终由启动类加载器开始加载(一般最终会查询到加载Object类)。
- 解析字节码数组,在内存中创建对应的结构。
- 进行文件格式验证、元数据验证、字节码验证、符号引用验证
- 准备,初始化该元类结构所需的内存空间,设置为各类型的默认值(如int为0,boolean为false,引用类型为null)
- 解析,根据字节码数组中的信息,完成从符号引用到直接引用的过程(将修饰符的关联关系转换为内存中的关联关系)
- 初始化,根据字节码中的信息对元类中的静态结构进行初始化赋值。
- 完成类加载后,执行类中的main方法
- main方法作为静态方法 由invokestatic 指定执行,查询instanceKlass中的方法区信息。执行main方法对应的字节指令
- 构建栈帧结构,组织方法所需的参数对象,放入局部变量表中,设置操作数栈空间作为运算的临时存储区域,创建程序计数器记录指令指针的偏移信息,以及链接,返回地址和其他一些用于调试的栈帧信息。
- 启动调用过程,对于参数信息,是直接直接放入局部变量表中的,对于在方法中创建的局部变量,则在创建后,由槽位对该变量进行引用。而操作数栈则用于存放运算中的临时数据。
- 对于创建的局部变量,会检查该变量的类是否被加载,如果未被加载,则启动类加载过程。之后根据new指令在堆中创建对应的对象,并将引用放入插槽中,在后续的执行中再通过插槽(数组偏移)取出对象参与执行。
- 之后就是依据执行的反复 入栈出栈过程。
- 对于不同的方法,jvm通过不同的指令来完成方法的调用
- 静态方法- invokestatic 直接绑定
- 私有方法,构造器方法,父类方法 - invokespecial 直接绑定
- 实例方法 - invokevirtual 通过虚方法表再使用偏移访问
- 接口实现方法 - invokeinterface 通过接口方法表进行查询
后续我们需要讨论,锁实现,反射实现和线程的实现。
JVM角度的Java程序执行过程
http://gadoid.io/2025/08/04/JVM角度的Java程序执行过程/