执行引擎是Java虚拟机核心组成部分,Java虚拟机是一个相对物理机的概念。物理机和Java虚拟机都具有执行引擎,物理机的执行引擎是作用在处理器、寄存器、内存和操作系统之上的。而Java虚拟机是由软件实现的,不受物理条件限制。
方法是Java虚拟机最基本的执行单元,栈帧(Stack Frame)是Java虚拟机方法调用和方法执行的数据结构。栈帧也是虚拟机运行时数据区虚拟机栈(Virtual Machine Stack)的栈元素。
栈帧存储了局部变量表、操作数栈、动态连接、方法返回地址和其他附加信息。
Java源码编译时就已经分析计算出“栈帧”需要多大的局部变量表、多深的操作数栈。
线程中方法的调用栈会很长,在同一时间、同一线程调用堆栈的所有方法都处于执行状态。但是,对于执行引擎而言,在活动的线程中,位于栈顶的方法才是运行的,位于栈顶的栈帧才是生效的。位于栈顶的栈帧是“当前栈帧”,位于栈顶的方法是“当前方法”。
局部变量表(Local Variables Table)是一组存储变量值的存储空间,用于存储方法参数和方法内部定义的局部变量。
操作数栈又称操作栈,是一个后进先出(Last in first out)的栈,和局部变量表一样,在Java源码编译时已经分析计算出操作栈的深度。操作数栈每个元素都可以包括long和double在内的任何Java数据类型。
每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有该引用是为了支持方法调用过程中的动态连接。
方法执行中通过两种方式退出方法
1. 执行引擎遇到任意一个方法返回的字节码指令,这是可能会有值返回到方法调用者。
2. 方法执行的过程中遇到异常放回。