运行时栈帧结果
栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,他是虚拟机运行时数据区中的虚拟机栈的栈元素。
栈帧存储了方法的局部变量表,操作数栈,动态连接和方法返回地址信息等
对于执行引擎来说,在活动线程中,只有位于栈顶的栈帧才是有效的,称为当前栈帧,与这个栈帧相关联的方法称为当前方法。
局部变量表
是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量
局部变量表的容量以变量槽位最小单位。
操作数栈
是一个先入先出栈,32位数据类型所占的栈容量为1,64位为2。
动态连接
每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接。
方法返回地址
方法两种退出方式:正常完成出口和异常完成出口
解析
调用目标在程序代码写好、编译器进行编译时就必须确定下来,这类方法的调用称为解析
java虚拟机里提供5条方法调用字节码指令
invokestatic:调用静态方法
invokespecial :调用实例构造器<init>方法、私有方法和父类方法
invokevirtual:调用所有的虚方法
invokeinterface:调用接口方法,会在运行时再确定一个实现此接口的对象
invokedynamic:先在运行时动态解析出调用点限定服所引用的方法,然后再执行该方法,分派逻辑由用户所设定的引导方法决定的
invokestatic 和invokespecial 指令调用的方法一般为非虚方法,还有一种就是被final修饰的方法
分派
1.静态分派
静态类型的变化在使用时发生,变量本身的静态类型不会变化,并且最终的静态类型是在编译器克制的;而实际类型变化的结果在运行期才可确定,编译器在编译程序的时候并不知道一个对象的实际类型是什么。虚拟机在重载时是通过参数的静态类型而不是实际类型作为判断依据的。
所有依赖静态类型来定位方法执行版本的分派动作称为静态分派。典型应用是方法重载。静态分派发生在编译阶段,因此确定静态分派的动作实际上不是由虚拟机来执行的。
动态分派
体现于重写,运行期根据实际实际类型确定方法执行版本的分派过程称为动态分派
单分派和多分派
方法的接受者与方法的参数统称为方法的宗量,多于一个宗量对目标方法选择称为多分派