文章目录
8.1 概述
- 从概念模型的角度了解虚拟机的方法的调用和字节码执行。
8.2 运行时栈帧结构
- 栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,是运行时数据区中的虚拟机栈的栈元素。
- 每一个栈帧都包含了局部变量表、操作数栈、动态连接、方法放回地址、和一些额外的附加信息。
8.2.1 局部变量表
- 局部变量表是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。
- 局部变量表的容量以变量槽(slot)为最小单位。
- 为了尽量节省栈帧空间,局部变量表中的slot可以重用。
8.2.2 操作数栈
- 当一个方法刚刚开始执行的时候,这个方法的操作数栈是空的,在方法执行过程中,会有各种字节码指令王操作数栈中写入和提取内容,也就是出栈/入栈操作。
8.2.3 动态连接
- 每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接。
8.2.4 方法返回地址
- 方法退出后,都需要返回到方法被调用的位置,程序才能继续执行,方法返回时可能需要在栈桢中保存一些信息,用来帮助恢复它的上层方法的执行状态。
8.2.5 附加信息
- 虚拟机规范中允许具体的虚拟机实现增加一些规范里没有描述的信息到栈帧之中。如调试相关的信息。
8.3 方法调用
- 方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本,暂时还不涉及方法内部的具体运行。
8.3.1 解析
- 解析调用是一个静态的过程,在编译器就可以完全确定,在类装载的解析阶段就会把涉及的符号引用全部转变为可确定的直接引用,不会延迟到运行期区完成。
8.3.2 分派
- 虚拟机如何确定正确的目标方法。
- 静态分派
- Animal animal = new Cat(); “Animal”称为变量的静态类型,“Cat”称为变量的实际类型。
- 所有依赖静态类型来定位的方法执行版本的分派动作称为静态分派。
- 动态分派
- 和多态的一个重要体现—重写 有着重要的关联。
- 依赖实际类型来定位的方法执行版本的分派动作成为动态分派。