执行引擎在执行Java代码的时候,可能有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)两种选择,也可能是二者兼备。所有引擎都是一致的:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是结果。
栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构。它是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)的栈元素。
栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。每一个方法从调用开始到执行完成的过程,就对应着一个栈帧的在虚拟机栈里面从入栈到出栈的过程。
确定被调用方法的版本,即调用哪一个方法。
1. 解析——静态的
- invokestatic:调用静态方法
- invokespecial:调用实例构造器<init>方法、私有方法和父类方法
- invokevirtual:调用所有的虚方法。但final是非虚方法却用此调用
- invokeinterface:调用接口方法,会在运行时再确定一个实现此接口的对象。
2. 分派
- 静态分派——重载方法
在编译阶段,Java编译器根据参数的静态类型决定调用哪个方法。所有依赖静态分派类型来定位方法执行版本的分派动作,都成为静态分派。
优先级:准确类型 > 自动装箱类 > 自动装箱类接口 > 自动装箱类父类 > 可变参数
- 动态分派——重写方法
把运行期根据实际类型确定方法的分派过程成为动态分派。
![]()
![]()
![]()
- 单分派和多分派
单分派——动态分派 多分派是静态分派