概述
执行引擎是Java虚拟机核心组成部分之一,它在执行字节码时有两种方式:解释执行和编译执行(通过即时编译器产生本地代码执行),统一输入二进制字节码流,输出执行结果。
运行时栈帧结构
Java虚拟机以方法做为基本执行单元,栈帧(stack Frame)是用于支持虚拟机进行方法调用和方法执行背后的数据结构。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等。
对于执行引擎来说,只有位于栈顶的方法才是在运行的,只有栈顶的方法才是生效的,其被称为当前栈帧,与这个栈帧所关联的方法被称为“当前方法”。
局部变量表
是一种变量值的存放空间,作用是存放方法参数和方法定义的局部变量。
局部变量表以变量槽(variable slot)为最小单位。一个变量槽可以存放一个32位以内的数据类型,Java中占用不超过32位存储空间的数据类型有boolean、byte、char、short、int、float、reference[1]和returnAddress这8种类型。前面6种不需要多加解释,读者可以按照Java语言中对应数据类型的概念去理解它们(仅是这样理解而已,Java语言和Java虚拟机中的基本数据类型是存在本质差别的),而第7种reference类型表示对一个对象实例的引用,《Java虚拟机规范》既没有说明它的长度,也没有明确指出这种引用应有怎样的结构。但是一般来说,虚拟机实现至少都应当能通过这个引用做到两件事情,一是从根据引用直接或间接地查找到对象在Java堆中的数据存放的起始地址或索引,二是根据引用直接或间接地查找到对象所属数据类型在方法区中的存储的类型信息。
局部变量槽存放不大于32位的数据,若大于,可以分割成两次32位的读写操作。对于两个相邻的共同存放一个64位数据的变量槽,虚拟机不允许单独访问其中任何一个,保证数据原子性。
当一个方法被调用时,Java虚拟机会使用局部变量表来完成参数值到参数变量列表的传递过程,即实参到形参的传递。如果执行的是实例方法(没有被static修饰的方法),那局部变量表中第0位索引的变量槽默认是用于传递方法所属对象实例的引用,在方法中可以通过关键字“this”来访问到这个隐含的参数。其余参数则按照参数表顺序排列,占用从1